我目前正在阅读Stoyan Stefanov的书"面向对象的JavaScript",我偶然发现了一个有趣的问题.这是代码:
var shape = {
type: 'shape',
getType: function() {
return this.type;
}
};
function Triangle(a, b, c) {
this.a = a;
this.b = b;
this.c = c;
this.type = 'triangle';
}
Triangle.prototype = shape; // changing the prototype object
Triangle.prototype.getPerimeter = function() {
return this.a + this.b + this.c;
}
var t = new Triangle(1, 2, 3);
t.constructor; // logs Object() instead of Triangle(a, b, c)
Run Code Online (Sandbox Code Playgroud)
如您所见,这是一个构造函数的简单示例,其中包含原型对象的一些属性.但是对象t的构造函数属性指向Object()对象而不是Triangle(a,b,c),因为它应该具有.如果我用原型更改评论该行,一切正常.我的问题是什么?(重读面向对象的Javascript和JavaScript模式中的整个原型章节,找不到答案).PS抱歉我的英语不好,试着去练习.:)
我将分两部分解释您的代码.首先,constructor实际上是什么属性?其次,为什么不在Objects代码中返回?
constructor财产和斯托扬的错误:在Stoyan Stefanov的书中,p150,他说:
prototype是一个定义函数后立即创建的属性.它的初始值是一个空对象.
这是错的.根据JavaScript权威指南第9.2节
prototype属性的初始值是具有单个属性的对象.此属性名为constructor,并返回与原型关联的构造函数.
你可以测试一下Triangle.prototype.constructor.已定义函数时已设置.
结论1: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
Run Code Online (Sandbox Code Playgroud)
结论2:当您访问constructor实例的属性时,您可以从原型链中获取它们.
您可以设置Triangle.prototype到shape其中不包含原始constructor属性.
因此,这次,当您查询时t.constructor,它将在以下过程中解决它:
constructort.__proto__,这是Triangle.prototype.您已将其设置为shape不包含该constructor属性.t.__proto__.__proto__.它是Triangle.prototype.__proto__,它被解决为Object.prototype.Object.prototype拥有constructor财产,它是指Object.| 归档时间: |
|
| 查看次数: |
498 次 |
| 最近记录: |