JavaScript语言精粹-笔记1-对象
阅读时间:全文 768 字,预估用时 4 分钟
创作日期:2020-04-26
BEGIN
对象(Object)的定义
- 对象是可变的键控集合(keyed collections)
- 对象是属性的容器, 其中每个属性都有名字和值
- 除了简单数据类型(数字、字符串、布尔值、null、undefined), 其它都是对象
- 数字、字符串和布尔值虽然拥有方法, 但是是不可变的, 所以不是对象
- 对象是无类型(class-free)的, 它对新属性的名字和属性的值没有限制
简单概念
- 对象字面量(Object Literals): 就是初始化一个对象变量, 继承自
Object.prototype
- 检索(Retrieval): 就是取值
- 更新(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)
检查对象并确定对象是否包含某个属性的方法:
- 使用
typeof flight.attr
判断是否返回undefined
, typeof方法会查找原型链中是否包含这个属性 - 使用
flight.hasOwnProperty('attr')
返回是否为true
, hasOwnProperty方法不会查找原型链
枚举(Enumeration)
使用for in
可以枚举对象的属性名, 但这种方式会将原型链的属性名也枚举出来, 且属性名出现的顺序是不固定的
一般推荐定义数组存放属性名, 并循环该数组检索出属性值, 安全又顺序固定
删除(Delete)
使用delete运算符删除对象的属性, 如果对象包含该属性, 那么该属性就会被移除, 且不会对原型产生影响
FINISH