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;

换句话说,有没有办法让两个对象继承另一个对象的原型,但仍然可以作为函数调用?

注意:我将在 Adob​​e ExtendScript(又名 Crippled Javascript)中使用它,它对现代 javascript 了解不多。就像, Object.defineProperty 在其中不起作用。那么,有没有一种正常的、标准的方法来做到这一点?

4

2 回答 2

3

使用 apsillers 的链接问题,我能够通过一项调整使其工作: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 回答