W3QはBiztterに生まれ変わりました!
Web制作に関するお悩みはBiztterへどうぞ!

Biztterで質問する

ID:vj9l2U さんの質問

javascriptの継承というのは、こんな感じで行なっておけば良いのでしょうか?

//親オブジェクト
var Enermy = function(){

this.attack = function(){
console.log("attack");
}

}

//子オブジェクト
var Slime = function() {
this.escape = function() {
console.log("escape");
}
}

//継承
Slime.prototype = new Enermy();

//オブジェクト生成
var slime = new Slime();

slime.attack(); // output : "attack"
slime.escape(); // output: "escape"

Object.create()なるもので、プロトタイプ継承を行なうみたいなことが書かれていて、上記のようなことをObject.create()で実現しようと以下のように試みたのですが、当たり前ですがエラーとなり上手くいかず。。。

//親オブジェクト
var Enermy = {

attack: function() {
console.log("attack");
}
}

//子オブジェクト
var Slime = function() {

escape: function(){
console.log("escape");
}
}

//SlimeのprototypeにEnemyを入れる
Slime = Object.create(Enermy);

//オブジェクト生成
var slime = new Slime();

slime.attack();
slime.escape();

質問としましては、jsでの継承は1つ目の書き方で良いのかということと、2つ目のやり方で1つ目でやっていることを実現するためにはどうすれば良いのかを教えて頂きたいと言った内容となります。

どうぞよろしくお願いいたしますm(_ _)m

みんなの回答 1 件

ID:9pjiXa さんの回答

1つ目の書き方で、継承は上手くいってると言えなくもないのかもしれません。
ですが、そもそもクラスとしてダメです。
;
function Enermy() { }
Enermy.prototype.attack = function () {
 console.log("attack");
}
;
function Slime() { }
Slime.prototype = Object.create(Enermy.prototype);
Slime.prototype.constructor = Slime;
Slime.prototype.escape = function () {
 console.log("escape");
}
;
var slime = new Slime();
;
もしくは、オブジェクトベースで継承関係を作りたいのならこうします。
;
var Enermy = { };
Enermy.attack = function () {
 console.log("attack");
};
;
var Slime = Object.create(Enermy);
Slime.escape = function () {
 console.log("escape");
};
;
var slime = Object.create(Slime)
;
実際はこんなに書いてるのは大変なので、ヘルパー関数を使うとよいです。
__proto__を使ったり、ES6コンパイラを使ってclass構文で書くともっとよく書けます。

ID:mK.pJ7

まあこの回答の1つ目の書き方がいいかな
コンストラクタで処理する場合は親のコンストラクタ呼ぶのも忘れずに
とりあえず質問者さんはprototypeを継承の時の呪文としか理解できていないように見えるから、prototypeの意味をよく理解するのがいいと思う

ID:f3SIT.

ヘルパー関数ってのは自作ですか?

最終更新日:2014-09-13 (1,295 views)

関連するトピックス

ページ上部に戻る