Javascript MDN构造函数属性解释混乱
我正在阅读有关Javascript MDN构造函数属性解释混乱,javascript,Javascript,我正在阅读有关constructorproperty的内容,其中说明了以下内容: 返回对创建实例的 原型 他们举了一个例子: function Tree(name) { this.name = name; } var theTree = new Tree('Redwood'); console.log('theTree.constructor is ' + theTree.constructor); 这里的实例是theTree,它的原型是Object.getPrototypeOf(the
constructor
property的内容,其中说明了以下内容:
返回对创建实例的
原型
他们举了一个例子:
function Tree(name) {
this.name = name;
}
var theTree = new Tree('Redwood');
console.log('theTree.constructor is ' + theTree.constructor);
这里的实例是
theTree
,它的原型是Object.getPrototypeOf(theTree)
,它是对象函数,而不是Tree
。我误解了什么?对象的原型通常继承自其构造函数:
function Tree() {}
Tree.prototype.foo = function () {};
var theTree = new Tree();
theTree
现在从原型链中获得了tree.foo
。功能树
初始化了对象,并负责其原型链的内容。这就是为什么他们将其表示为“创建实例原型的对象函数”。Object.getPrototypeOf(theTree)是树函数的原型
Object.getPrototypeOf(theTree) == Tree.prototype; // true
两者都指同一对象
并且Tree.prototype具有名为“constructor”的属性,该属性实际上只是对树函数的引用
theTree.contructor == Tree.prototype.constructor ;// true
基本上,树有一个proto链接(proto),这个proto链接指向Tree.prototype。
因此,当您执行Tree.constructor时,它实际上遵循proto链接,到达Tree.prototype,并找到它本身的树函数的构造函数。它可能只是取决于调试环境/浏览器的具体情况,即名称是解析为并显示为
树
,还是仅显示为这个通用的“对象函数”。@deceze,但树
并没有创建树的原型,而是创建了实例。这是一个令人困惑的部分不要在console.log()
中将内容转换为字符串,它隐藏了重要的细节。@阿尔瓦罗冈萨雷斯,谢谢,不是我,是MDN的家伙)我现在明白了,谢谢。所以基本上,constructor
property与找出对象的原型来自何处更相关,然后与理解创建对象使用了什么函数更相关?我认为MDN是否能够以更直接的方式编写这句话相当有争议。什么.constructor
与“更相关”取决于您想使用它做什么;老实说,到目前为止,我还没有必要用它来做任何事情,所以我不太适合对此发表评论。我明白了,谢谢。我认为它可能与prototype
相关,因为它可以在继承检查中使用,比如Tree
的树实例,如果Tree
为树创建了原型,那么就不是树。prototype
必须在树的原型链中。你认为这个假设足够好吗?是的,你可能一直在间接地使用.constructor
,比如instanceof
。
Object.getPrototypeOf(theTree) == Tree.prototype; // true