2

メインクラスを作成する必要があり、次に と のanimalプロパティを継承する 2 つのサブクラスを作成し、複数のオブジェクト (複数の猫と犬) をクラスから継承させ、(実際にはクラスではないと読みましたが、次のように動作します)クラス)。animalcatdogcatdog

複数のオブジェクト (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

そのためのパターン、Observer パターンがあります。動物が音を出すと、他の動物に通知されます (彼らはそれを「聞きます」)。

this.listen = function(otherAnimal) 
{
    alert(this.name + "heard " + otherAnimal.name);
}

したがって、関数は、音を「聞く」ことができるすべての動物makeSoundのメソッドを呼び出す必要があります。listenそのためには、それらを知る必要があります。つまり、それらのリストを持っているか、1 つしかない場合はそれへの参照を持っている必要があります。

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:型に基づいて決定を行うためにiforを使用しないでください。switchそれがOOPの目的です。

于 2013-06-30T16:42:57.937 に答える