javascript - 让一个javascript函数继承一个原型(prototype)

标签 javascript inheritance prototype

<分区>

Possible Duplicate:
How do I make a callable JS object with an arbitrary prototype?

假设我们有多个单独的函数,我们可以在它们自己的上下文中单独调用它们;但它们也继承了其他一些对象的原型(prototype)。像这样:

//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;

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

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

最佳答案

使用 apsillers 的链接问题,我能够通过一个调整让它工作:Human 的属性和方法被定义为一个对象:

试一试:http://jsfiddle.net/lbstr/JZP2S/

关键是HumanMaker函数。在基本层面上,它接受一个函数并向其添加 Human 原型(prototype)。这允许您调用您的函数,从 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;​

关于javascript - 让一个javascript函数继承一个原型(prototype),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13863891/

相关文章:

javascript - 为什么 setState(null) 不改变状态值

javascript - socket.io 循环在开始时终止

javascript - Jquery/JavaScript : Sort a datatable on column that has <a>

javascript - 获取从日期算起的整周

c++ - 推导和模板化使用之间有什么区别? (请看上下文)

JavaScript 原型(prototype) - 技术面试

inheritance - 运行时的 Fortran TYPE 继承(由用户声明)

java - 如何检索 Java 反射的子类?

javascript - 将此参数绑定(bind)到命名参数

javascript - 扩展对象导致 jQuery 错误