0

extendコンストラクターが、Backbone のメソッドを介して継承が設定されている別のコンストラクター Backbone.js スタイルを拡張するかどうかをテストするにはどうすればよいですか? そして言わないでくださいinstanceof:)。私はオブジェクトについて話しているのではありません。私はコンストラクターについて話している。

例: 次のコードで生成されるようなコンストラクターを使用します。

var MyRouter = Backbone.Router.extend();

さて、コードの別の場所で、プロトタイプ チェーンのどこかでvar my_router = new MyRouterのプロパティがあることをどのようにテストできますBackbone.Router.prototypeか?

4

1 に答える 1

0

これが私の解決策です:

var inherits = function(child, parent) {
  if (!_.isFunction(child) || !_.isFunction(parent)) 
    throw new Error('`child` and `parent` must be functions.'); 

  return _.reduce(Object.getPrototypeOf(child.prototype), function(memo,  child_prototype__proto__) {    
    return _.contains(parent.prototype, child_prototype__proto__) && memo;
  }, true);
}

したがって、次のことができます。

var MyRouter = Backbone.Router.extend();
inherits(MyRouter, Backbone.Router) // true
inherits(MyRouter, Backbone.Model) // false

extendこれは、バックボーンの機能が上記のように使用された単一層のバックボーン スタイルの継承で機能します。

Backbone はプロトタイプ チェーンをセットアップするときに次のことを行うため、動作しextendます。childparent

var Surrogate = function(){ this.constructor = child; };
Surrogate.prototype = parent.prototype;
child.prototype = new Surrogate;

したがって、結果として得られるコンストラクターは、extendそのプロパティに親のすべてのプロトタイプ プロパティを持ち.prototype.__proto__ます。これが初めての場合やわかりにくい場合は、John Resig のブログで詳細を読むことができます。基本的に、"test".__proto__ === String.prototype.

于 2013-03-16T08:32:11.700 に答える