Javascript 原型链可以';无法获取对象()?
我读了一篇解释什么是原型链的文章 它说,如果我试图访问一个对象的属性,但它没有,javascript引擎将尝试它的Javascript 原型链可以';无法获取对象()?,javascript,prototype-oriented,Javascript,Prototype Oriented,我读了一篇解释什么是原型链的文章 它说,如果我试图访问一个对象的属性,但它没有,javascript引擎将尝试它的.constructor.propotype。如果没有,请尝试.construtor.propotype.constructor.propotype。直到找到内置对象() 但我要测试一下: function a() {} b = new a(); 然后: 我得到一个空的对象 然后: 我得到一个空的对象 它循环。无论我调用多少个.constructor.prototype,它都找不到
.constructor.propotype
。如果没有,请尝试.construtor.propotype.constructor.propotype
。直到找到内置对象()
但我要测试一下:
function a() {}
b = new a();
然后:
我得到一个空的对象
然后:
我得到一个空的对象
它循环。无论我调用多少个.constructor.prototype
,它都找不到Object()。发生了什么?我是否误解了原型链 看来我问了一个愚蠢的问题
如果A是一个函数:
A.prototype.constructor==A
如果A不是函数:
A.标准属性中的原型
因此(在标准中)没有办法爬上原型链。在JS OOP中,构造函数
和原型
属性是脆弱的,因为它们在执行继承时不是为您设置的。您应该手动设置/更改它们以实现继承。例如,请参见
它看起来像是你试图攀登原型链的方式(通过遍历.constructor.prototype
)从未真正到达对象
顶级原型,因为当你有函数a(){}
时,正确的构造函数
和原型
属性并没有设置在。我甚至无法强迫他们到a
;在Chrome中,我得到:
> function a(){}
undefined
> a.constructor.prototype
function Empty() {}
> a.constructor.prototype = Object.prototype
Object
> a.constructor.prototype
function Empty() {} // hmmmm, the assignment didn't take...
当然,运行时不需要这样做,因为它引用了每个对象的实际原型。也就是说,该语言不通过.constructor.prototype
进行查找,而是在内部保存每个实例的原型。因此,如果您使用。\uuuuu proto\uuuu
,而不是.constructor.prototype
,您可以看到查找链是如何工作的:
function a(){}
b = new a();
b.__proto__ === Object.prototype; // false
b.__proto__.__proto__ === Object.prototype; // true since we reached the top of the prototype chain
需要注意的是,属性\uuuu proto\uuu
从来都不是标准的,在ES5中,标准化的方式略有不同:
obj.__proto__ === Object.getPrototypeOf(obj);
这使得。\uuuuuu proto\uuuuuuuuuuu
不推荐使用。虽然我理解,但答案更详细,因此我应该接受它。
function a(){}
b = new a();
b.__proto__ === Object.prototype; // false
b.__proto__.__proto__ === Object.prototype; // true since we reached the top of the prototype chain
obj.__proto__ === Object.getPrototypeOf(obj);