0

我想要做的是:

我的基本代码:

var Obj = function() {
    this.do = function() {};
    this.stop = function() {};
    this.kill = function() {};
};

Obj.prototype.load = function() {};

所需的转换:

var ConvObject = function() { };
ConvObject.prototype = (typeof Obj == "function")? new Obj : Obj;

此示例有效(用于转换部分)。在 ConvObject 中,Obj 的所有方法都在那里。但就我而言,我不想执行 Obj 的默认构造函数。我宁愿避免这种情况。确实,我不想执行新的 Obj。

我尝试了不同的方法来实现这一点。这是我现在能找到的最佳答案:

var getSizeOf = function(obj) {
  var size = 0, key;
  for (key in obj) {
    if (obj.hasOwnProperty(key)) size++;
  }
  return size;
};

var ConvObject = function() { };
if ((typeof Obj == "function") && getSizeOf(Obj.prototype) == 0) {
  ConvObject.prototype = new Obj;
}
else {
  ConvObject.prototype = (typeof Obj == "function")? Obj.prototype : Obj;
}

这在 Obj 看起来像这样时有效:

var Obj = new function() {};
Obj.prototype.do = function() {};
Obj.prototype.stop = function() {};
Obj.prototype.kill = function() {};
Obj.prototype.load = function() {};

或者,如果它看起来像这样:

var Obj = function() {
    this.do = function() {};
    this.stop = function() {};
    this.kill = function() {};
    this.load = function() {};
};

但是,当我有上面的基本代码时,这个解决方案会失败。如何避免对默认构造函数的调用?谢谢您的帮助!

4

1 回答 1

1

使用Object.create()(或其 polyfill)直接从Obj.prototype.

要从Obj构造函数中“继承”实例方法,您应该在每个实例上调用它ConvObject非常简单的 Javascript 继承。当这些方法是特定于实例的方法时,您无论如何都需要这样做,否则它们应该在原型上。

于 2012-06-12T17:26:19.687 回答