我正在实现一个也可以在节点上运行的 JavaScript 库,我想尽可能多地使用节点的 API。我的对象发出事件,所以我找到了一个名为eventemitter2的不错的库,它重新实现了 JavaScript 的 EventEmitter。现在我想为util.inherits找到相同的内容。有人听说过这样的项目吗?
问问题
2485 次
2 回答
8
您是否尝试过使用 Node.js 实现?(它使用Object.create
,因此它可能会或可能不会在您关心的浏览器上运行)。这是来自https://github.com/joyent/node/blob/master/lib/util.js的实现:
inherits = function(ctor, superCtor) {
ctor.super_ = superCtor;
ctor.prototype = Object.create(superCtor.prototype, {
constructor: {
value: ctor,
enumerable: false,
writable: true,
configurable: true
}
});
};
CoffeeScript 使用了另一种方法,它编译
class Super
class Sub extends Super
到
var Sub, Super,
__hasProp = {}.hasOwnProperty,
__extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; };
Super = (function() {
function Super() {}
return Super;
})();
Sub = (function(_super) {
__extends(Sub, _super);
function Sub() {
return Sub.__super__.constructor.apply(this, arguments);
}
return Sub;
})(Super);
于 2012-11-02T19:43:52.577 回答
6
您不需要使用任何外部库。只需按原样使用 javascrit。
B 继承自 A
B.prototype = Object.create (A.prototype);
B.prototype.constructor = B;
在 B 的构造函数内部:
A.call (this, params...);
如果你知道javascript有一个名为constructor的属性,那么就避免它,不需要隐藏或不枚举它,避免避免避免。不需要超属性,只需使用 A.call 即可。这是 javascript,不要尝试像使用任何其他语言一样使用它,因为你会惨遭失败。
于 2012-11-03T12:46:16.123 回答