0

JavaScriptコンストラクターを理解しようとして、私はこの質問を見てきました。

私にはそれを合理的に理解しているように見えましたが、皮肉なことに、同様のコードを実行しようとすると、まったく機能しませんでした。

これは私のコードです

function Car(name) {
    this.Name = name;
    this.Year = 1999;
}

Car.prototype.Drive = function() {
    document.write("My name is '" + this.Name + "' and my year is '" + this.Year + "'. <br />");
};

SuperCar = function () { };
SuperCar.prototype = new Car();

function SuperCar(name) {
    Car.call(this, name);
}

var MyCar = new Car("mycar");
var MySuperCar = new SuperCar("my super car");

MyCar.Drive();
MySuperCar.Drive();

まずはこのライン

SuperCar = function () { };

それがまったく実行されるために必要でした。省略した場合、この行に「SuperCar is undefined」というエラーが表示されます。

SuperCar.prototype = new Car();

SuperCar を空の関数として宣言する必要がある理由がよくわかりません。

次に、コードを実行すると、この結果が得られます

My name is 'mycar' and my year is '1999'. 
My name is 'undefined' and my year is '1999'. 

どうやら、MySuperCar の場合、SuperCar(name) 関数は呼び出されませんが、Car() は呼び出されます。

この行を追加しても役に立ちません

SuperCar.prototype.constructor = SuperCar;

これもそうではない

SuperCar.prototype.constructor = function(name) {
    Car.call(this, name);
};

(IE 9 と Chrome 22 のスクリプトタグ内でコードを実行しています)

name パラメーターを取る SuperCar コンストラクターを適切に定義するにはどうすればよいですか? または、別の言い方をすれば、新しい SuperCar("my super car") 呼び出しを期待どおりに動作させるにはどうすればよいでしょうか (名前を "my super car" に設定します)。

4

2 に答える 2

4

のインスタンスをプロトタイプとして実際に作成するのではなくCar、 から継承するオブジェクトのみを作成する必要がありますCar.prototype。詳しくはDerived.prototype = new Base で 'new' キーワードを使う理由をご覧ください。代わりに、

SuperCar.prototype = Object.create(Car.prototype);

あなたの問題はSuperCar、空の関数によって s が作成されていることです。これは、プロパティのないオブジェクトを返します。しかし、それらは から継承しnew Car()、そのnameundefinedです。関数宣言(キーワードで始まる、この説明functionをチェックしてください)が巻き上げられ(スコープ内のどこでも利用可能)、次の行で上書きされるため、これはフィドルで発生しました

SuperCar = function () { };

SuperCarコンストラクターがコンストラクターを呼び出さないようにしますCar固定フィドル

于 2012-09-30T11:54:10.010 に答える
2

empty 関数は必要ありませんでした。空のSuperCar関数を作成し、そのプロトタイプを設定しましたが、 の新しい定義で上書きしましたSuperCar

function SuperCar() {}
SuperCar.prototype = new Car();

function SuperCar() {} // original SuperCar overwritten
于 2012-09-30T11:44:06.367 に答える