Javascript中“new”和“prototype.constructor”之间的联系是什么?

时间:2012-05-06 18:49:20

标签: javascript

这似乎已被许多人讨论过。但不幸的是,我找不到我的问题的答案。 这是一段关于Javascript继承的代码(来自一本书):

function Car() {
    var self = this;
    self.type = "Car"
    self.go = function() {
        console.log("Going...");
    };
};

Toyota = function() { console.log("Original called"); };
Toyota.prototype = new Car();
Toyota.prototype.constructor = function() {
    var self = this;
    self.type = "Toyota";
    self.go = function() {
        console.log("A Toyota car is going...");
    }
};
Toyota.prototype.isJapaneseCar = true;

function TestCar() {
    console.log("Toyota.prototype.constructor: " + Toyota.prototype.constructor);
    var t = new Toyota();
    console.log("t.constructor: " + t.constructor);
    console.log(t.type);
};

Firefox控制台中的输出:

Toyota.prototype.constructor: function () {
    var self = this;
    self.type = "Toyota";
    self.go = function () {
        console.log("A Toyota car is going...");
    };
    }
Original called
t.constructor: function () {
    var self = this;
    self.type = "Toyota";
    self.go = function () {
        console.log("A Toyota car is going...");
    };
    }
Car

从输出中显示新丰田()电话:

var t = new Toyota();

没有按预期调用 Toyota.prototype.constructor 函数,而是仍然调用首先定义的函数:

Toyota = function() { console.log("Original called"); };

具有高upvote计数的post给出了相当详细的解释和示例:它说“ 3.它执行构造函数,只要提到这个就使用新对象。”提到的“构造函数”是否引用prototype.constructor?以下3行如何相关:

  1. Toyota = function(){console.log(“Original called”); }
  2. Toyota.prototype.constructor = function(){...
  3. var t = new Toyota();
  4. [编辑]最让我困惑的是为什么当我打电话给新的Toyota()时,没有调用构造函数(Toyota.prototype.constructor)

1 个答案:

答案 0 :(得分:2)

constructor对象中的prototype属性包含对构造该类型对象的实例的函数的引用。希望我不要在这里混淆。

对于字符串对象,您会看到constructor属性引用String函数(非正式的a.k.a构造函数。)

console.log("".constructor); // would print function String() { [native code] }

这就是我们通常将类(即函数)constructor属性重新分配给它自己的原因。

Toyota.prototype.constructor = Toyota;

var t = new Toyota();
console.log(t.constructor); // prints function Toyota() { /* definition */ }

希望能回答你的问题。