-
- 如果无法在对象本身找到需要的属性,就会继续访问对象的
[[Prototype]]链 - 它会创建一个对象并把这个对象的
[[Prototype]]关联到指定的对象- 此时的myObject.__proto__ === anotherObjectmyObject.__proto__.__proto__.__proto__ = null
- 使用
for..in遍历对象时原理和查找[[Prototype]]链类似,任何可以通过原型链访问到(并且是enumerable,参见第3章)的属性都会被枚举。- for...in 任何可以通过原型链查找到的,并且是enumerable的都会被枚举出来
- 使用
in操作符来检查属性在对象中是否存在时,同样会查找对象的整条原型链(无论属性是否可枚举)- 无论属性是否可以被枚举,只要找到了,就返回true
- 包含JavaScript中许多通用的功能。
- Object.prototype是原型链的尽头,它的上一级是null
-
- 赋值语句中,会先寻找属性的位置,如果不直接存在在对象上,那么就去找原型链,如果找到,就赋值;如果没有在原型链上找到,就在对象上直接赋值如果原型链上有并且对象上也有这个属性,对象上的属性会屏蔽掉原型链上的属性
- 如果
foo不直接存在于myObject中而是存在于原型链上层时myObject.foo = "bar"会出现的三种情况- 对象属性与原型链上的属性同名情况:1. 如果原型链上的属性没有标记为只读,那么就屏蔽2. 如果原型链上的属性标记为只读,那么就不能创建同名的对象属性【严格模式下报错,非严格模式忽略赋值】3. 如果原型链上的这个属性有[[setter]],那么就调用这个[[setter]],这个属性不会被添加对象属性上
- 第二种情况可能是最令人意外的,只读属性会阻止
[[Prototype]]链下层隐式创建(屏蔽)同名属性。这样做主要是为了模拟类属性的继承 - 更奇怪的是,这个限制只存在于=赋值中,使用
Object.defineProperty(..)并不会受到影响。- = =?fuck...
- myObject.a++; // 隐式屏蔽!
- 但是别忘了
++操作相当于myObject.a = myObject.a + 1。- 太可怕了,都不好发现
- JavaScript中只有对象。
- JavaScript是基于原型的可以这么说,JavaScript才是真正被称为面向对象的语言,因为它可以不通过类来创建对象,直接操作对象像Java更像是面向类的语言
-
-
null 与 undefined的区别 | GeraldChen's Blog
-
- null和undefined转换成Boolean都是false不同的是 Number(null) ==> 0Number(undefined) ==> NANnull == undefined ==>true (因为两边都被转换成了false)null === undefined ==> false(因为严格等于不进行类型转换,所以这两个是不相等的)
-
- typeof null ==> “object”typeof undefined ==> "undefined"
- 变量被声明了,但没有赋值时,就等于undefined。
- 调用函数时,应该提供的参数没有提供,该参数等于undefined
- 函数没有返回值时,默认返回undefined。
- 所以在控制台上调用函数经常返回了个undefined
-
2016年10月3日星期一
Google Blog 10/04/2016 (a.m.)
订阅:
博文评论 (Atom)
没有评论:
发表评论