首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >原型链无法获取Object()?

原型链无法获取Object()?
EN

Stack Overflow用户
提问于 2011-06-08 17:16:18
回答 2查看 1.1K关注 0票数 3

我读了一个article,它解释了什么是原型链。

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

但我测试了一下:

代码语言:javascript
复制
function a() {}
b = new a();

然后:

代码语言:javascript
复制
c = b.constructor.prototype

我得到一个空的a对象。

然后:

代码语言:javascript
复制
d = c.constructor.prototype

我得到一个空的a对象。

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-06-08 19:58:05

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

看起来你试图爬上原型链的方式(通过遍历.constructor.prototype)永远不会真正到达Object的顶层原型,因为当你有function a(){}时,正确的constructorprototype属性并没有设置在一个上。我甚至不能设法将它们强制到a上;在Chrome中我得到:

代码语言:javascript
复制
> 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进行查找,它在内部保存每个实例的原型。因此,如果使用.__proto__而不是.constructor.prototype,那么您可以看到查找链是如何工作的

代码语言:javascript
复制
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中是以稍微不同的方式标准化的:

代码语言:javascript
复制
obj.__proto__ === Object.getPrototypeOf(obj);

这会使.__proto__弃用。

票数 2
EN

Stack Overflow用户

发布于 2011-06-08 19:11:02

看起来我问了一个愚蠢的问题。

如果A是一个函数:

A.prototype.constructor === A

如果A不是一个函数:

普通属性中的A.prototype。

所以(在标准情况下)没有办法爬上原型链。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6276581

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档