2

バックボーン モデル/コレクション/ビューを確認できるのと同じ方法で、見ているオブジェクトが _.template のインスタンスであるかどうかを検出できるようにしたいと考えています。

例えば:

var newView = new Backbone.View();
newView instanceof Backbone.View //true

//How I usually use template
var test = _.template("test");
test instanceof _.template //false

//When I would actually expect a successful instanceof check
var test2 = new _.template("test");
test2 instanceof _.template //false

私は代わりにこれに頼っています:

typeof test == "function"

アンダースコア テンプレートではなく現在文字列である場合、テンプレートを _.template でラップするだけなので、これは基本的に私の状況では十分です。

しかし、私の2つの質問 -

現在、instanceof _.template を確認する方法があるかどうか疑問に思っています。

そうでない場合、このチェックを可能にするためにテンプレートの Prototype チェーンを拡張するのは非常にコストがかかりますか? はるかに遅い場合を除き、これは Underscore の (マイナーな) 障害のようです。

4

2 に答える 2

3

methodのソースを_.template見ると、ここで間違ったツリーを作成していることがわかります。Underscore は_.templateオブジェクトをインスタンス化するのではなく、ソース コードの文字列を構築してコンパイルすることで、新しい関数を構築しています。それとnew Function()。したがって、使用しているテンプレート関数は新しい無名関数であり、何かのインスタンスではありません。

テンプレートを識別する方法が本当に必要な場合は、_.template関数を装飾して何らかのフラグを追加することをお勧めします-おそらくconstructorプロパティとして:

var originalMethod = _.template;
_.template = function() {
    var template = originalMethod.apply(_, arguments);
    template.constructor = _.template;
    return template;
}

var t = _.template('Foo <%= bar %>');
t({ bar: "baz" }); // "Foo baz"
t.constructor === _.template;  // true
于 2013-08-23T21:43:20.810 に答える
3

_.template特定のもののインスタンスではなく、で使用することになっているものではなく、単なる古い関数を返すだけです。newこれは単なる単純な関数です。

ソースを見ると(このような質問には強くお勧めします)、 の構造が_.template多かれ少なかれ次のようになっていることがわかります。

// A bunch of stuff to convert the template to JavaScript code
// which is combined with some boiler plate machinery and left
// in `source`
// ...
render = new Function(settings.variable || 'obj', '_', source);
template = function(data) { return render.call(this, data, _); };
return template;

したがって、返されるの_.template(str)は単なる無名関数であり、特別なプロトタイプチェーンは設定されておらず、共通して使用できるのinstanceofFunction. t instanceof Functionこの場合、本当に役に立たないかどうかを尋ねると、typeof t == 'function'まだ行っていないことは何もできないと思います。

ただし、返された関数にプロパティを_.template追加します。source

sourceプロパティは、コンパイルされたテンプレート関数で使用できるため、簡単に事前コンパイルできます。

inしたがって、instanceoforと組み合わせることで物事を引き締めることができますtypeof

typeof t === 'function' && 'source' in t
t instanceof Function  && 'source' in t

これらはどちらから来たtrue場合にも当てはまります (ただし、もちろん、その逆は必ずしも真ではありません)。t_.template

デモ: http://jsfiddle.net/ambiguous/a2auU/

2 番目の質問に関する限り、どのようにして持つことができ、そうでないときに両方が機能するのかはわかりt()ませt instanceof TT(Functionもちろん、明らかな何かが欠けている可能性がありますが、ネイティブ型をいじるのは、一般的に JavaScript ではうまくいきません)。あなたが言いたい場合:

var t = _.template(s);
var h = t.exec(...);

その代わりにt(...)、それは簡単ですが、Underscore テンプレートについて知っているすべてのものと互換性がありません。

于 2013-08-23T21:41:21.790 に答える