javascript - 原型(prototype)链获取不到Object()?

标签 javascript prototype-oriented

我读了一篇 article这解释了什么是原型(prototype)链。

它说如果我尝试访问一个对象的属性但它没有它,javascript 引擎将尝试它是 .constructor.propotype。如果它也没有,请尝试 .construtor.propotype.constructor.propotype。直到找到内置的 Object()。

但是我测试了这个:

function a() {}
b = new a();

然后:

c = b.constructor.prototype

我得到一个空的 a 对象。

然后:

d = c.constructor.prototype

我得到一个空的 a 对象。

它循环。无论我调用多少.constructor.prototype,它都找不到Object()。怎么了?我对原型(prototype)链有误解吗?

最佳答案

在 JS OOP 中,constructorprototype 属性不稳定,因为当您执行继承时它们不会为您设置。您应该手动设置/更改它们以实现继承。参见,例如,this tutorial .

看起来您尝试攀登原型(prototype)链的方式(通过遍历 .constructor.prototype)从未真正到达 Object 顶级原型(prototype),因为当您有 function a(){} 时,正确的 constructorprototype 属性不会在 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...

当然,运行时不需要这样做,因为它有对每个对象的实际原型(prototype)的引用。 IE。该语言不会通过 .constructor.prototype 进行查找,它会在内部保存每个实例的原型(prototype)。因此,如果您使用 .__proto__ 而不是 .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

重要的是要注意属性 __proto__ 从来都不是标准的,在 ES5 中以稍微不同的方式标准化:

obj.__proto__ === Object.getPrototypeOf(obj);

这使得 .__proto__ 已弃用。

关于javascript - 原型(prototype)链获取不到Object()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6276581/

相关文章:

php - 谷歌地图实现导致谷歌页面速度问题

javascript - JavaScript .prototype 是如何工作的?

javascript - 如何在不调用其构造函数的情况下复制对象及其原型(prototype)链?

javascript - 只获取最后一个类分配给 this.class

javascript - 如何在 Javascript 中声明一个静态变量

javascript - 动态添加<webview>无效

Javascript - 解析 XML 文档以创建数组

javascript - jQuery 验证插件和自定义输入

javascript - 无法让 idAttribute 在 Backbone 中工作