我正在尝试掌握使用原型继承的方法。这是我下面的代码。它基于 Stoyan Stefanov 的“面向对象的 Javascript”一书,仅作了一些修改。
基本上我有一个Athlete
扩展对象的Person
对象。我创建了 3 个对象。Bob 是 a Person
,而 Billy Jean 和 Steve 是Athletes
。我按特定顺序添加了 Bob、Billy Jean 和 Steve。对于对象,我按以下特定顺序在所有 3 个对象中调用了say()
andrun()
函数和getSpeed()
and :Bob、Billy Jean 和 Steve。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 的属性弹出了两次,这意味着 Steve 替换了 Billy Jean。输出如下所示。
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
我只是想知道是否有办法将比利让和史蒂夫分开,这样我就可以得到他们的详细信息而不是史蒂夫的详细信息两次?
如果不可能,那么我可以使用什么替代方法来解决这个问题?任何解决方案或帮助都会有很大帮助。