Javascript继承和特权函数

Javascript继承和特权函数,javascript,javascript-objects,Javascript,Javascript Objects,可以在Javascript中继承特权方法吗?在下面的示例中,小部件成功地继承了D函数,但未继承subscribe。将inherit中的第二行更改为f.prototype=newbase()似乎有效,但我知道出于各种原因这是不好的。有没有一个干净的方法来做到这一点,还是我必须公开一切?这似乎意味着我必须公开这些方法(附在原型上),但我想直接问一下 function EventRaiser() { var events = {}; this.subscribe

可以在Javascript中继承特权方法吗?在下面的示例中,小部件成功地继承了
D
函数,但未继承
subscribe
。将inherit中的第二行更改为
f.prototype=newbase()似乎有效,但我知道出于各种原因这是不好的。有没有一个干净的方法来做到这一点,还是我必须公开一切?这似乎意味着我必须公开这些方法(附在原型上),但我想直接问一下

    function EventRaiser() {
        var events = {};
        this.subscribe = function(key, func) { /* elided */ };
    }
    EventRaiser.prototype.D = function() { alert("D"); };

    function Widget() { }

    function Inherit(sub, base) {
        function f() { }
        f.prototype = base.prototype;
        sub.prototype = new f();
        sub.prototype.constructor = sub;
    }

    Inherit(Widget, EventRaiser);

this.subscribe=function(key,func){/*elided*/}

在这里,您可以将一个方法添加到当前的
thisContext

Inherit(Widget,EventRaiser)

在这里,销售prototype小部件应该使用prototype EventRaiser

最好不要将
this.x
prototype.y

或者你可以调用
EventRaiser.call(this)
function Widget(){}
中,但这是一种糟糕的风格

如果您打算使用继承模式,我建议您使用&:

或者,如果您坚持认为
Widget
应该继承自
EventRaiser

var Widget = Object.create(EventRaiser, pd({
    ...
});
var widget = function _widget() {
    var o = eventRaiser(Widget);
    Object.defineProperties(o, pd({
        ...
    });
    return o;
}
推荐这种模式的原因是原型和工厂的明确分离。这允许您在不处理工厂的情况下与原型交互。使用
new
关键字,你会弄脏那些水域(如代码中所示),而且你也会对
这个
进行攻击


上面的代码看起来也不优雅。这意味着你真的不需要寻找一种不同的模式。例如,node.js中的
EventEmitter
有一个用于
this.\u events
对象,它使工厂代码更加优雅。

您的特权方法
this.subscribe
仅附加到
EventRaiser
的实例

当你考虑这条线:

时,这应该是显而易见的。
this.subscribe = function(...) { } ;
仅在调用
EventRaiser()
时执行


如果你不创建一个
EventRaiser
对象,那么这个属性就永远不会被继承。

EventRaiser.call(this)
就是我所需要的。为什么是那种糟糕的风格?链接到基本构造函数在OO语言中是常见的做法,即使这个JS示例在AdamRackis中也能做到这一点,因为基本构造函数并没有概念。在JavaScript中模拟经典的OO和Java。那是糟糕的风格
this.subscribe = function(...) { } ;