2

我需要创建一个主类animal,然后让两个子类继承animal其属性catdog,然后我要让多个对象(多个猫和狗)从该类继承,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声明,我听说我可以使用 like a if (callback) callback{}但我尝试实现类似的东西失败了。我是 javascript 的新手,最近几天才开始学习它。任何帮助或帮助将不胜感激。

4

2 回答 2

2

这就是我会做的事情......我会设置那些正在倾听的人。listening是创建新对象时的可选参数。您还可以使用创建后更改正在收听的人setListeninglistening在这种情况下,将只是一个具有name属性的对象数组。

此外,我修复了一些问题,您要么没有“名称”,要么在任何情况下都没有设置它。

http://jsfiddle.net/n9xCM/

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

/*-----------------------*/
于 2013-06-30T15:11:55.387 回答
1

有一个模式,观察者模式。当一只动物发出声音时,其他动物会收到通知(它们会“听”它)。

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可以通过构造函数或方法作为参数传入。

PS:永远不要使用iforswitch来根据类型做出决定。这就是 OOP 的用途。

于 2013-06-30T16:42:57.937 回答