本文将讲述特殊属性__proto__,通过此属性可以获取或设置一个对象的原型
一些历史原因:
自从__proto__在firefox中出现后,它变得越来越流行了,现在V8(chrome和node.js)和nitro(safari)也支持此属性,但是在ECMAScript5中,并没有相关的规范,而__proto__将在ECMAScript6中,得到支持。
函数原型
众所周知,在ECMAScript中,一个对象的内部属性prototype是指向自己原型的
function A(){…}
var a = new A();
那么
a.prototype === A // false,并不是这样理解
a.prototype实际上,应该是undefined
我们可以通过Object.getPrototypeOf(对象)来获取对象的原型
再来:
Object.getPrototypeOf(a) === A; // false,因为a = newA(),是让a的原型,”继承”[暂时木有更好的词汇]了A的原型,即A.prototype
Object.getPrototypeOf(a) === A.prototype;// true
对象原型
设置对象的原型,有两个方法[PS:都不支持IE8及以下版本,以上的,就木有测试]:
方法一:
var source = {a:1, b:2};
var obj = Object.create(source);
obj.c = 3;
// obj.a === 1;
// obj.b === 2;
// Object.getPrototypeOf(obj) === source;
方法二:
var source = {a:1, b:2};
var obj = {__proto__: source, c: 3};
// obj.a === 1;
// obj.b === 2;
// Object.getPrototypeOf(obj) === source;
两种方法,效果是等价的,不过,在定义额外属性的时候,__proto__会比Object.create简单一些。例子见上面 obj.c 的定义。
AND 更多Object.create的详情,请自行搜索呗~。