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()(またはそのポリフィル) を使用して、 から直接継承しObj.prototypeます。

コンストラクターからインスタンス メソッドを「継承」するには、次のように呼び出すObj必要がありConvObjectます。これらのメソッドがインスタンス固有の場合はとにかくこれを行う必要があります。それ以外の場合はプロトタイプにある必要があります。

于 2012-06-12T17:26:19.687 に答える