我编写了如下javascript代码:
function Shape() {
this.x = 0;
this.y = 0;
}
function Rectangle() {
Shape.call(this); // call super constructor.
}
Rectangle.prototype = Object.create(Shape.prototype);
function Tmp() {
this.a = 0;
this.b = 0;
}
Rectangle.prototype.constructor = Tmp;
var rect = Object.create(Rectangle.prototype);
console.log(rect)

然后输出是:
rect应该由构造函数初始化Tmp.my问题是由构造函数Tmp初始化的对象rect的属性a和b在哪里?
答案 0 :(得分:3)
rect应该由构造函数Tmp
初始化
如果你想要,你会这样做:
Tmp.call(rect);
...后
var rect = Object.create(Rectangle.prototype);
function Shape() {
this.x = 0;
this.y = 0;
}
function Rectangle() {
Shape.call(this); // call super constructor.
}
Rectangle.prototype = Object.create(Shape.prototype);
function Tmp() {
this.a = 0;
this.b = 0;
}
//Rectangle.prototype.constructor = Tmp;
var rect = Object.create(Rectangle.prototype);
Tmp.call(rect);
console.log(rect);
Object.create
根本不调用任何函数,它只是使用给定的原型创建对象。因此Rectangle
不会调用Shape
,Tmp
和var rect = Object.create(Rectangle.prototype);
。
或者如果您还希望Rectangle
完成工作,请将Object.create
来电替换为:
var rect = new Rectangle();
Tmp.call(rect);
非常奇怪将constructor
的{{1}}属性设置为Rectangle.prototype
,而不是Tmp
。我强烈建议不这样做。如果你想要Rectangle
来初始化一个实例,则没有必要。 Tmp
引用的对象的constructor
属性应为SomeFunction.prototype
,而不是其他任何内容。