オブジェクトには名前ではなくアイデンティティがあります。 オブジェクトを作成したコンストラクターの名前(オブジェクトのタイプと見なすことができます。ECMAScript仕様を参照)を知りたい場合、防弾アプローチは、その情報を構築されたオブジェクトの一部にすることです。
var Model1 = Backbone.Model.extend({type: "Model1"});
var Model2 = Backbone.Model.extend({type: "Model2"});
var MyView = Backbone.View.extend({
render: function () {
console.log("You are using " + this.model.type);
}
});
var mv1 = new MyView({model: new Model1()});
var mv2 = new MyView({model: new Model2()});
type
このように、モデルオブジェクトはプロトタイプチェーンを介してプロパティを継承します。http://backbonejs.org/#View-renderも参照してください。
代替の、効率が低く、信頼性の低いソリューションには、次のものがあります。
コンストラクターに名前を付けて、それにアクセスします。
var Model1 = Backbone.Model.extend();
Model1.name = "Model1";
var MyView = Backbone.View.extend({
render: function () {
console.log("You are using " + this.model.constructor.name);
}
});
var mv1 = new MyView({model: new Model1()});
var mv2 = new MyView({model: new Model2()});
(name
コンストラクターが
var Model1 = function Model1 () {
// …
};
また
function Model1 ()
{
// …
}
しかし、それは–残念ながら– Backbone.jsの方法ではありません。)
Function
コンストラクターなどの名前付きインスタンスの文字列表現を解析します。しかし、それは実装に依存します:
var Model1 = function Model1 () {
// …
};
var MyView = Backbone.View.extend({
getModelName: function () {
var aFunction = this.model.constructor;
return (aFunction != null && typeof aFunction.name != "undefined" && aFunction.name)
|| (String(aFunction).match(/\s*function\s+([A-Za-z_]\w*)/) || [, ""])[1];
},
render: function () {
console.log("You are using " + this.getModelName());
}
});
(jsx.object.getFunctionName()として実装されています。ただし、Backbone.jsではAIUIを完全に使用することはできません。)
instanceof
DashKの回答で提案されているように使用します。しかし、それはあなたにすぐにまたは確実に情報を与えるものではありません。プロトタイプチェーンに最も重要な名前を最初に配置し、プロトタイプチェーンを変更するたびにメソッドを変更する必要があるため、そうしないと、誤検知と誤検知が発生します。
var MyView = Backbone.View.extend({
render: function () {
var modelName = "an unknown model";
if (this.model instanceof Model1)
{
modelName = "Model1";
}
else if (this.model instanceof Model2)
{
modelName = "Model2";
}
else if (this.model instanceof Supermodel)
{
modelName = "Supermodel";
}
console.log("You are using " + modelName);
}
});