1

重複の可能性:
任意のプロトタイプで呼び出し可能な JS オブジェクトを作成するにはどうすればよいですか?

独自のコンテキストで個別に呼び出すことができる複数の個別の関数があるとします。しかし、それらは他のオブジェクトのプロトタイプも継承しています。このような:

//Here is the parent object:
var Human = function(){
    this.isAlive = true;
};
Human.prototype.say = function(what){
    alert(what + '!');
};

//These will inherit from it:
var ninja = function() {
    alert("I'm a ninja!");
}
var samurai = function(){
    alert("I'm a samurai!");
}

//Now, how can I make ninja and samurai behave like this:
ninja(); //I'm a ninja!
samurai(); //I'm a samurai!
ninja.say('Hello'); //Hello!

//And they should keep their inheritance. Like:
Human.prototype.die = function(){
    this.isAlive = false;
}

ninja.die();
ninja.isAlive == false;

samurai.isAlive == true;

言い換えれば、別のオブジェクトのプロトタイプを継承しながら、関数として呼び出し可能な 2 つのオブジェクトを持つ方法はありますか?

:これをAdobe ExtendScript(別名Crippled Javascript)で使用しますが、最新のjavascriptはあまり知りません。同様に、 Object.defineProperty は機能しません。それで、これを行う通常の標準的な方法はありますか?

4

2 に答える 2

3

apsillers のリンクされた質問を使用して、1 つの調整で動作させることができました:Humanのプロパティとメソッドはオブジェクトとして定義されます:

試してみてください: http://jsfiddle.net/lbstr/JZP2S/

キーはHumanMaker関数です。Human基本的なレベルでは、関数を取り、それにプロトタイプを追加します。これにより、関数を呼び出し、すべてのプロパティを取得しHumanて食べることができます。ここにあります:

function HumanMaker(f) {
    var h = Human;
    h.__proto__ = f.__proto__;
    f.__proto__ = h;
    return f;
}

次のように呼び出します。

var ninja = HumanMaker(function() {
    alert("I'm a ninja!");
});

ここにすべてがあります:

var Human = {
    isAlive: true,
    say: function(what){
        alert(what + '!');
    },
    die: function(){
        this.isAlive = false;
    }
};

function HumanMaker(f) {
    var h = Human;
    h.__proto__ = f.__proto__;
    f.__proto__ = h;
    return f;
}

//These will inherit from it:
var ninja = HumanMaker(function() {
    alert("I'm a ninja!");
});
var samurai = HumanMaker(function(){
    alert("I'm a samurai!");
});

//Now, how can I make ninja and samurai behave like this:
ninja(); //I'm a ninja!
samurai(); //I'm a samurai!
ninja.say('Hello'); //Hello!


ninja.die();
ninja.isAlive == false;

samurai.isAlive == true;​
于 2012-12-13T17:19:40.797 に答える
0

関数型継承パターンの方がはるかに理解しやすいといつも思っています。

var human = function(){
    var me = {};
    var _isAlive = true;
    Object.defineProperty(me, "isAlive", {
        get: function() { return _isAlive}
    });

    me.say=function(what){
        if(_isAlive)
          alert(what+'!');  
        else
           throw new Error('I am dead!');                
    }
    me.die=function(){
      _isAlive = false;                
    }
    return me;
};

var person = function(){
    var me = human();
    return me;
};        

var ninja = function(){
    var me = human();
    me.say = function(what){
        if(me.isAlive)
          alert(what+', I am a ninja!');  
        else
           throw new Error('I am dead!');          
    };
    return me;
};

var myPerson = person();
myPerson.say('hi');

var myNinja = ninja();
myNinja.say('hello');

ここにデモを残しました: http://jsfiddle.net/vtortola/nbpPt/

乾杯。

于 2012-12-13T16:34:42.673 に答える