如果原型被用于多个子类,是否可以从它的原型创建一个对象的实例?
例如,如果我有:
var BaseClass = Backbone.Model.extend({
createNewForMap: function(map) {
// Here I would like to create a new instance of the
// class that the method is being called for.
}
});
var ClassOne = BaseClass.extend({});
var ClassTwo = BaseClass.extend({});
然后,在我的应用程序代码中的某个地方,我希望能够调用:
var model = ClassOne.createNewForMap(map);
或
var model = ClassTwo.createNewForMap(map);
让model
成为ClassOne
或ClassTwo
的实例。
答案 0 :(得分:0)
可以在BaseClass
上定义一个静态方法,该方法将作为它的工厂函数或继承它的任何子类。
Backbone.Model.extend允许您指定所谓的classProperties
,这可能被认为是来自保守OOP编程的静态方法的类似物。
var BaseClass = Backbone.Model.extend({}, {
// A static method for invoking constructor function.
createNewForMap: function(map) {
return new this;
}
});
var ClassOne = BaseClass.extend({
initialize: function() { this.foo = 'bar' }
});
var ClassTwo = BaseClass.extend({
initialize: function() { this.foo = 'buz' }
});
console.log(ClassTwo.createNewForMap().foo); // buz

<script src="//underscorejs.org/underscore-min.js"></script>
<script src="//backbonejs.org/backbone-min.js"></script>
&#13;
答案 1 :(得分:0)
您可以使用constructor
属性来获取对象“class”的引用:
<强> Object.prototype.constructor 强>
返回对创建实例原型的
Object
函数的引用。请注意,此属性的值是对函数本身的引用,而不是包含函数名称的字符串。
所以你可以这样说:
createNewForMap: function(map) {
var obj = new this.constructor();
//...
}
和obj
与this
属于同一类型。