关于javascript原型的一些事情

时间:2018-02-07 11:00:04

标签: javascript javascript-events javascript-objects

我编写了如下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)




然后输出是:

enter image description here

rect应该由构造函数初始化Tmp.my问题是由构造函数Tmp初始化的对象rect的属性a和b在哪里?

1 个答案:

答案 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不会调用ShapeTmpvar 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,而不是其他任何内容。