我需要创建一个主类animal
,然后有两个子类继承animal
cat
和dog
的属性,然后我要创建多个对象(多个猫和狗)从类cat
和dog
继承(我读它不是一个真正的类,但它表现为一个类)。
多个对象(cat1,mycat,tomcat,dog1,mydog,topdog)需要能够相互通话和倾听。说话时,我会让他们只提醒或打印文本行。我遇到麻烦的是听力部分。当myCat发出声音时,我希望个人myDog打印出“狗听猫”。这是我到目前为止的代码。
var animal = function (name, sound, listen) {
var f = 0;
this.name = name; // this.prop means prop is public var.
this.sound = sound;
this.listen = listen;
this.makesound = function () {
alert(this.sound);
}
this.listen = function () {
alert(this.name + "heard that");
}
return this;
};
/*--------------- inheritance -----------------------------------*/
var cat = function () {
this.name = name;
this.sound = 'meow';
return this;
};
cat.prototype = new animal();
function dog(name) {
dog.sound = 'woof';
dog.name = name;
return this;
};
dog.prototype = new animal();
/*-------- different kinda dogs/cats ----------------------------*/
var myCat = new cat();
var myDog = new dog();
var tomCat = new cat();
var bigDog = new dog();
/*-----------------------*/
我想我应该使用if
声明,我听说我可以使用它
if (callback) callback{}
但我尝试实现类似的东西却失败了。我是全新的javascript,只是在过去几天学习它。任何帮助或帮助将非常感激。
答案 0 :(得分:2)
我就是这样做的......我会设置那些正在倾听的人。创建新对象时,listening
是可选参数。您还可以使用setListening
更改创建后正在收听的人员。在这种情况下,listening
只是一个具有name
属性的对象数组。
另外,我修复了一些问题,你要么没有“名字”,要么就是没有设置它。
var animal = function (name, sound, listening) {
var f = 0;
this.name = name; // this.prop means prop is public var.
this.sound = sound;
this.listening = listening;
this.makesound = function () {
alert(this.sound);
this.listen();
}
this.setListening = function (listening) {
this.listening = listening;
}
this.listen = function () {
console.log("in listen ("+this.listening.length+")");
for (var i = 0; i < this.listening.length; i++) {
alert(this.listening[i].name + " heard that");
}
}
return this;
};
/*--------------- inheritance -----------------------------------*/
var cat = function (name, listening) {
this.name = name;
this.listening = listening;
this.sound = 'meow';
return this;
};
cat.prototype = new animal();
function dog(name, listening) {
this.sound = 'woof';
this.listening = listening;
this.name = name;
return this;
};
dog.prototype = new animal();
/*-------- different kinda dogs/cats ----------------------------*/
var myDog = new dog("mydog");
var myCat = new cat("mycat", [myDog]);
var bigDog = new dog("buster");
var tomCat = new cat("tommy", [bigDog]);
myCat.makesound(); //meow - mydog heard that
bigDog.setListening([myDog, myCat, tomCat]);
bigDog.makesound(); //woof - mydog/mycat/tommy heard that
/*-----------------------*/
答案 1 :(得分:1)
有一种模式,Observer pattern。当动物发出声音时,其他动物会收到通知(他们'听'它)。
this.listen = function(otherAnimal)
{
alert(this.name + "heard " + otherAnimal.name);
}
因此makeSound
函数必须调用所有能够“收听”声音的动物的listen
方法。要做到这一点,它必须知道那些,即有一个列表,或者只有一个,有一个参考。
function makeSound() {
alert(this.sound);
for (var i = 0; i < this.listening.length; i++) {
this.listening[i].listen(this);
}
// OR this.listening.listen(this); if it can only be one other animal
}
listening
可以通过构造函数或方法作为参数进入。
P.S。:永远不要使用if
或switch
根据类型做出决定。这就是OOP的用途。