首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >难以手动行走原型链

难以手动行走原型链
EN

Stack Overflow用户
提问于 2015-04-30 19:15:50
回答 1查看 733关注 0票数 8

我想试着手动走几个物体的原型链,看看我在路上发现了什么。然而,我在第一次尝试的时候被困住了。下面是代码:

代码语言:javascript
复制
function MyObject() { }
var x = new MyObject();
console.log('--------------------------------------------');
console.log('x.constructor.name: ' + x.constructor.name);
console.log('x.constructor.prototype.constructor.name: ' + x.constructor.prototype.constructor.name);
console.log(x.constructor.prototype === Function.prototype ? 'Good guess.' : 'No, you are wrong.');
console.log(x.constructor === MyObject ? 'Good guess.' : 'No, you are wrong.');
console.log('--------------------------------------------');

上面的代码在Google的Developer Tools控制台中产生了以下输出:

代码语言:javascript
复制
--------------------------------------------
x.constructor.name: MyObject
x.constructor.prototype.constructor.name: MyObject
No, you are wrong.
Good guess.
--------------------------------------------

X的构造函数是MyObject函数,这是合理的,因为x是使用MyObject上的新关键字实例化的(这是从构造函数的定义中得到的)。因此,我理解了输出的第一行(注意:我开始从零开始计数输出行)。然而,第二行让我感到困惑。我想知道MyObject的原型是什么。显然,它不是一个类型函数的对象,正如输出的第3行所示,这告诉我我错了。第四行输出只是增强了第一行的输出。

在更一般的说明中,我假设正确的方法是将对象的原型链从所讨论的对象转到它的构造函数,然后从构造函数到构造函数的原型,假设最后的引用不是null。我假设这个两个步骤的过程(包括到构造函数,然后到构造函数的原型)应该重复,直到从构造函数到原型的空引用到达,从而表示原型链的结束。但是,这似乎不起作用,因为将该算法应用于上述场景只会导致循环引用。

总之,我有两个问题:

  1. 为什么x.constructor === x.constructor.prototype.constructor (或者,换句话说,为什么是循环引用),以及x.constructor.prototype是什么样的对象(或者,换句话说,它是如何被实例化的/它是从哪里来的)?
  2. 如何纠正上述算法,以便正确地遍历对象x的原型链?

编辑

我在StackOverflow 这里上遇到了一个类似的问题,但它并没有明确地问走原型链的正确方式。它确实指出了循环引用,尽管.

EN

回答 1

Stack Overflow用户

发布于 2015-04-30 20:07:52

是啊,一开始可能有点难理解。我不能做得比给你提供一些链接更好。当我有困难的时候,这些总是帮助我解决问题。

http://dmitrysoshnikov.com/ecmascript/javascript-the-core/

http://mckoss.com/jscript/object.htm

http://zeekat.nl/articles/constructors-considered-mildly-confusing.html

Q1:关于“为什么”,请参阅上面的参考资料。x.constructor.prototypex.__proto__,它是x的内部“真实”原型,至少在没有覆盖prototypeconstructor属性的情况下是这样。它是在定义函数MyObject时创建的。

Q2:不幸的是,你不能这样做。您可以在支持__proto__属性的地方使用它,但请参见

对象/对象/原

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

https://stackoverflow.com/questions/29975939

复制
相关文章

相似问题

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