1

これは多くの人が議論しているようです。しかし、残念ながら、私の問題に対する答えは見つかりませんでした。以下は、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

出力から、 new Toyota()呼び出しが次のように示されます。

var t = new Toyota();

Toyota.prototype.constructor関数を期待どおりに呼び出さなかった代わりに、最初に定義された関数を呼び出します。

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

賛成票数の多い投稿では、例とともにかなり詳細な説明がありました。「3.これが言及されるたびに、新しいオブジェクトを使用してコンストラクター関数を実行します。」言及された「コンストラクター」はprototype.constructorを参照していますか? 次の 3 行はどのように関連していますか。

  1. Toyota = function() { console.log("元の呼び出し"); }
  2. Toyota.prototype.constructor = function() { ...
  3. var t = 新しいトヨタ();

[編集] new Toyota()を呼び出したときにコンストラクター(Toyota.prototype.constructor) が呼び出されないのはなぜですか?

4

1 に答える 1

2

オブジェクトのconstructorプロパティにprototypeは、そのタイプのオブジェクトのインスタンスを構築する関数への参照が含まれています。私がここで混乱させようとしていないことを願っています。

文字列オブジェクトの場合、関数を参照するconstructorプロパティが表示されStringます(非公式にコンストラクターとも呼ばれます)。

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 */ }

それがあなたの質問に答えることを願っています。

于 2012-05-06T19:03:24.460 に答える