JavaScriptのプロトタイプチェーンについて、いまいちよく分かっていなかったのですが
以下の2つを読んで、
どうやってプロトタイプチェーンを作るのかと、
プロトタイプチェーンがあるときのプロパティ解決の考え方が分かりました。
-
[JavaScript] そんな継承はイヤだ - クラス定義 - オブジェクト作成
https://qiita.com/LightSpeedC/items/d307d809ecf2710bd957 -
クラスの落とし穴3 - 継承
https://qiita.com/cocottejs/items/e75f751c7aa8a7361aab
結局のところ
MyDog < Dog < Animal < Object
のようなプロトタイプチェーンを作りたいときは以下のようにすればいいようですね。
サンプルコード
MyDog.js
function Animal() {
}
function Dog() {
}
Dog.prototype = Object.create(Animal.prototype, {
constructor: {
value: Dog,
enumerable: false
}
});
function MyDog() {
}
MyDog.prototype = Object.create(Dog.prototype, {
constructor: {
value: MyDog,
enumerable: false
}
});
動作確認
var myDog = new MyDog();
console.log(myDog.constructor); // MyDog
console.log(Object.getPrototypeOf(myDog)); // MyDog
console.log(
Object.getPrototypeOf(
Object.getPrototypeOf(myDog))); // Dog
console.log(
Object.getPrototypeOf(
Object.getPrototypeOf(
Object.getPrototypeOf(myDog)))); // Animal
console.log(
Object.getPrototypeOf(
Object.getPrototypeOf(
Object.getPrototypeOf(
Object.getPrototypeOf(myDog))))); // Object
console.log(myDog instanceof MyDog); // true
console.log(myDog instanceof Dog); // true
console.log(myDog instanceof Animal); // true
console.log(myDog instanceof Object); // true
上記から分かるように多重継承はできないようですね。
また、es6のclass継承では同じような処理をしているようですね。
続き JavaScriptのプロトタイプチェーン(継承)について ES6のclass