プロトタイプの継承を使用する方法を理解しようとしています。これが私が以下に持っているコードです。これは、Stoyan Stefanovによる「オブジェクト指向Javascript」という本に基づいていますが、いくつかの変更が加えられています。
基本的に私はAthlete
オブジェクトを拡張するオブジェクトを持っていPerson
ます。3つのオブジェクトを作成しました。ボブは、Person
ビリージーンとスティーブはAthletes
です。ボブ、ビリージーン、スティーブをその特定の順序で追加しました。ボブ、ビリージーン、スティーブの3つのオブジェクトすべてで、オブジェクトに対して、関数say()
とrun()
関数を呼び出しました。getSpeed()
jump()
Athlete
以下のコードがあります。
<script type="text/javascript">
function clone(o) {
var n;
function F(){};
F.prototype = o;
n = new F();
return n;
}
/* Uber is equivalent to the extends method */
function uber(parent, child) {
var n = clone(parent);
n.uber = parent;
for (var i in child) {
n[i] = child[i];
}
return n;
}
var Person = {
initialise: function(name)
{
this.name = name;
},
say: function()
{
console.log('My name is ' + this.name + '. I am a person');
},
run: function(){
console.log('I have run 5km');
},
jump: function() {
console.log('I have jumped for joy!');
}
};
var Athlete = {
initialise: function(name,speed) {
this.speed = speed;
//uber is the parent
this.uber.initialise(name);
},
say: function() { console.log('My name is ' + this.name + '. I am an athlete');},
run: function() { console.log('I have run 20km'); this.jump()},
getSpeed: function() {console.log('My Speed is: ' + this.speed + 'km Hour');}
}
var Athlete = uber(Person, Athlete);
console.log("Hello, Starting Test...");
var bob = clone(Person);
bob.initialise('Bob');
bob.say();
bob.run();
console.log("Adding Billy Jean...");
var billyJean = clone(Athlete);
billyJean.initialise('Billy Jean', 15);
console.log("Adding Steve...");
var steve = clone(Athlete);
steve.initialise('Steve', 25);
console.log("Asking Billy Jean...");
billyJean.say();
billyJean.run();
billyJean.getSpeed();
console.log("Asking Steve...");
steve.say();
steve.run();
steve.getSpeed();
</script>
ただし、コードを実行すると、最初にBilly Jeanの関数を呼び出しますが、Steveのプロパティが2回ポップアップします。つまり、SteveがBillyJeanを置き換えました。以下に示す出力。
Hello, Starting Test...
My name is Bob. I am a person
I have run 5km
Adding Billy Jean...
Adding Steve...
Asking Billy Jean...
My name is Steve. I am an athlete
I have run 20km
I have jumped for joy!
My Speed is: 15km Hour
Asking Steve Tran...
My name is Steve. I am an athlete
I have run 20km
I have jumped for joy!
My Speed is: 25km Hour
ビリー・ジーンとスティーブを分離して、スティーブの詳細ではなく両方の詳細を2回取得する方法があるかどうか、疑問に思っていました。
それが不可能な場合、この問題を解決するために代わりにどのような代替手段を使用できますか?どんな解決策や助けも大きな助けになるでしょう。