我将分两部分解释您的代码。首先,什么是constructor
实际上是财产吗?其次,为什么不返回Objects
在你的代码中?
The constructor
财产和斯托扬的错误:
在 Stoyan Stefanov 的书第 150 页中,他指出:
原型是在定义函数后立即创建的属性。它的初始值是一个空对象。
It is wrong。根据第 9.2 节
prototype属性的初始值是一个对象具有单一财产. 该属性被命名为构造函数并返回与原型关联的构造函数。
你可以测试它Triangle.prototype.constructor
。它在定义函数时就已设置。
结论1: the constructor
实际上是Constructor.prototype
。在你的情况下,它是Triangle.prototype.constructor
.
所有实例Triangle
可以通过原型链访问该属性。但这些物体本身并没有constructor
财产。下面的代码证明了这一点:
function Triangle(a, b, c) {
this.a = a;
this.b = b;
this.c = c;
this.type = 'triangle';
}
var t = new Triangle(1, 2, 3);
t.hasOwnProperty('constructor');
>>false
t.__proto__.hasOwnProperty('constructor');
>>true
结论2: 当您访问constructor
实例的属性,您可以从原型链中获取它们。
为什么它没有按您的预期工作
You set Triangle.prototype
to shape
which doesn't包含原来的constructor
财产。
因此,这一次,当你查询t.constructor
,它将通过以下过程解决它:
- 看一下它本身的属性,发现没有
constructor
- 继续仰望
t.__proto__
,即Triangle.prototype
。您已将其设置为shape
其中不包含constructor
财产。
- 沿着原型链继续查找——
t.__proto__.__proto__
. It is Triangle.prototype.__proto__
,并且它被解析为Object.prototype
. Object.prototype
有constructor
属性及其指的是Object
.