質問:
- 最初のメソッドがオブジェクトをフェラーリとして正しく識別するのはなぜですか?(Chromeでテスト済み)
- 2つの方法で継承を正しく行っていますか?
- 最初の例にはいくつかの隠された「コンストラクター」プロパティがあることを理解して正しいですか?もしそうなら、それらはどこにあり、何がそれらをそこに置いたのですか?明示的に入力しなかった2番目の例に隠されたコンストラクタープロパティはありますか?
- 継承を正しく行った場合、オブジェクトをフェラーリとして識別させるために、最後に2つの方法のどちらを使用する必要がありますか?それとも私は気にしないでください-結局のところ「instanceof」はまだ機能しますか?
コンテクスト:
オブジェクトを作成するためのJavaScriptの「新しい」メソッドを使用すると、正常に機能します。
Vehicle.prototype = {}; // Not required I know
function Vehicle() {
}
Car.prototype = new Vehicle();
function Car() {
}
Ferrari.prototype = new Car();
function Ferrari() {
}
var o = new Ferrari();
console.log(o);
どの出力:
> Ferrari
> __proto__ : Car
> __proto__ : Vehicle
> __proto__ : Object <- The one that isn't required
> __proto__ : Object <- Provided by JS
...
hasOwnProperty: function hasOwnProperty() { [native code] }
...
今、私は新しいキーワードを避けて同じことをしたいです、これが私が持っているものです:
Vehicle.prototype = {};
function Vehicle() {
var vehicle = Object.create(Vehicle.prototype);
return vehicle;
}
Car.prototype = Vehicle();
Car.prototype.constructor = Vehicle;
function Car() {
var car = Object.create(Car.prototype);
return car;
}
Ferrari.prototype = Car();
Ferrari.prototype.constructor = Car;
function Ferrari() {
var ferrari = Object.create(Ferrari.prototype);
//ferrari.constructor = Ferrari; <- Lookey here - commented line
return ferrari;
}
var o = new Ferrari();
console.log(o);
どの出力:
> **Car**
> __proto__ : Car
> constructor : function Car()
__proto__ : Vehicle
> constructor : function Vehicle()
__proto__ : Object <- The one that isn't required
> __proto__ : Object
...
hasOwnProperty: function hasOwnProperty() { [native code] }
...
出力の最初の行がフェラーリではなく車になっていることに注意してください。これは、コメント行を削除するか、フェラーリのプロトタイプを次のように変更することで修正できます。
var realPrototype = Car();
realPrototype.constructor = Car;
Ferrari.prototype = Object.create(realPrototype);
Ferrari.prototype.constructor = Ferrari;