如何使用javascript创建监听器

时间:2013-06-30 14:46:52

标签: javascript inheritance callback listener

我需要创建一个主类animal,然后有两个子类继承animal catdog的属性,然后我要创建多个对象(多个猫和狗)从类catdog继承(我读它不是一个真正的类,但它表现为一个类)。

多个对象(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,只是在过去几天学习它。任何帮助或帮助将非常感激。

2 个答案:

答案 0 :(得分:2)

我就是这样做的......我会设置那些正在倾听的人。创建新对象时,listening是可选参数。您还可以使用setListening更改创建后正在收听的人员。在这种情况下,listening只是一个具有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

/*-----------------------*/

答案 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。:永远不要使用ifswitch根据类型做出决定。这就是OOP的用途。