所有,我总是对对象的__proto__
和prototype
属性感到困惑,特别是在原型继承链中,假设有一个名为test
的对象,代码是下方。
test.add();//try to call a method name add.
在我的理解中,我绘制了一个图表来演示搜索流程。但我不确定它是否正确。请帮助审查它。谢谢。
根据Minko Gechev的回答进行了更正。
答案 0 :(得分:3)
只有函数具有prototype
属性,但任何对象都具有__proto__
属性。
通常,更改__proto__
属性明确更好地使用Object.create
之类的内容并不是一个好主意。
以下是一个例子:
function Person() {
}
var proto = { bar: 'baz' };
Person.prototype = proto;
这样,使用构造函数Person
创建的任何对象都将__proto__
属性引用到proto
作为结论,我们可以说:
prototype属性仅用于构造函数,它设置将使用此构造函数创建的所有对象的__proto__
属性。当解释器正在查找给定对象foo
的属性时,它首先在foo
后foo.__proto__
之后使用对象foo.__proto__.__proto__
,然后找到该属性