Table of Contents:
  1. 对象(Object)的定义
    1. 简单概念
      1. 复杂概念
        1. 引用(Reference)
          1. 原型(Prototype)
            1. 反射(Reflection)
              1. 枚举(Enumeration)
                1. 删除(Delete)

                JavaScript语言精粹-笔记1-对象

                Reading Time:The full text has 768 words, estimated reading time: 4 minutes
                Creation Date:2020-04-26
                Article Tags:
                 
                BEGIN

                对象(Object)的定义

                • 对象是可变的键控集合(keyed collections)
                • 对象是属性的容器, 其中每个属性都有名字和值
                • 除了简单数据类型(数字、字符串、布尔值、null、undefined), 其它都是对象
                • 数字、字符串和布尔值虽然拥有方法, 但是是不可变的, 所以不是对象
                • 对象是无类型(class-free)的, 它对新属性的名字和属性的值没有限制

                简单概念

                1. 对象字面量(Object Literals): 就是初始化一个对象变量, 继承自Object.prototype
                2. 检索(Retrieval): 就是取值
                3. 更新(Update): 更新对象值

                复杂概念

                引用(Reference)

                对象通过引用来传递, 它们永远不会被复制.

                var x = stooge;
                x.nickname = 'Curly';
                var nick = stooge.nickname; // 因为x和stooge是指向同一个对象的引用, 所以nick为'Curly'
                var a = {}, b = {}, c = {}; // a b c每个都引用一个不同的空对象
                a = b = c = {}; // a b c都引用同一个空对象

                原型(Prototype)

                每个对象都连接到一个原型对象, 并且它可以从中继承属性. 所以通过对象字面量创建的对象都连接到Object.prototype, 它是JavaScript的标配对象.

                创建一个新对象时, 选择一个对象作为它的原型, 定义Object.create函数实现如下:

                Object.create = function(o) {
                  var F = function() {};
                  F.prototype = o;
                  return new F();
                }

                执行var another_stooge = Object.create(stooge);, 此时another_stooge继承自stooge, stooge是another_stooge的原型.

                原型连接只有在检索值的时候才会被用到, 如果我们尝试去获取对象的某个属性值, 但该对象没有此属性名, 那么JavaScript会试着从该对象原型对象中获取属性值, 如果该对象原型对象也没有该属性, 那么再从它的原型中查找, 以此类推, 直到该过程最后到达终点Object.prototype. 如果属性完全不存在原型链中, 那么结果就是undefined值, 这个过程称为委托.

                原型关系是一种动态的关系, 如果我们添加一个新的属性到原型中, 该属性会立即对所有基于该原型创建的对象可见.

                stooge.profession = 'actor';
                another_stooge.profession // 'actor'

                反射(Reflection)

                检查对象并确定对象是否包含某个属性的方法:

                1. 使用typeof flight.attr判断是否返回undefined, typeof方法会查找原型链中是否包含这个属性
                2. 使用flight.hasOwnProperty('attr')返回是否为true, hasOwnProperty方法不会查找原型链

                枚举(Enumeration)

                使用for in可以枚举对象的属性名, 但这种方式会将原型链的属性名也枚举出来, 且属性名出现的顺序是不固定的

                一般推荐定义数组存放属性名, 并循环该数组检索出属性值, 安全又顺序固定

                删除(Delete)

                使用delete运算符删除对象的属性, 如果对象包含该属性, 那么该属性就会被移除, 且不会对原型产生影响

                FINISH

                Random Articles
                Life Countdown
                default