JS简记-对象关联

js的继承就是通过关联对象实现的,使用Object.prototype.isPrototypeOf()和instanceof可以判断一个对象是否在另一个对象关联链(__proto__链)上。

1 var o = {};
2 console.log(o instanceof Object);//true
3 console.log(Object.prototype.isPrototypeOf(o));//true
4 //注意,isPrototypeOf是Object.prototype对象的函数,这就意味着通常情况下,只有继承(关联)Object才能使用该函数。
5 o = Object.create(null);
6 console.log(o.isPrototypeOf(Object.prototype));//TypeError,isPrototypeOf为undefined,对undefined进行函数调用,自然是TypeError,这时就只能通过instanceof判断了。

 

当然也可以复制Object.prototype.isPrototypeOf

1 o = Object.create(null);
2 var proto = Object.create(null, {
3     isPrototypeOf:{
4         value: Object.prototype.isPrototypeOf
5     }
6 })
7 Object.setPrototypeOf(o, proto);//注意,由于没有继承Object.prototype中__proto__的setter/getter,所以这里不能使用o.__proto__ = proto;
8 console.log(proto.isPrototypeOf(o));

 

for in会遍历对象本身及其__proto__链上的所有enumerable属性,而Object.keys只会涉及对象自身的enumerable属性。

__proto__链会带来“父类”属性屏蔽:

 1 var son = Object.create(null);
 2 var parent= Object.create(null, {
 3     eye: {
 4         value: "blue",
 5         writable: true//使用普通字面量声明属性时,writable、enumerable、configurable默认均为true
 6     },
 7     age: {
 8         value: 30,
 9         writable: true
10     }    
11 });
12 Object.setPrototypeOf(son, parent);
13 son.eye = "black";
14 console.log(son.eye);//black
15 console.log(Object.getPrototypeOf(son).eye);//blue,parent的属性被屏蔽
16 son.age++
17 console.log(son.age);//31
18 console.log(Object.getPrototypeOf(son).age);//30,age++相当于age=age+1,parent的属性被屏蔽

 

附一张经典图:

 

posted @ 2018-05-06 22:02  holoyong  阅读(605)  评论(0编辑  收藏  举报