如何从prototype方法创建对象实例

时间:2015-12-23 16:15:49

标签: javascript backbone.js

如果原型被用于多个子类,是否可以从它的原型创建一个对象的实例?

例如,如果我有:

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成为ClassOneClassTwo的实例。

2 个答案:

答案 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;
&#13;
&#13;

答案 1 :(得分:0)

您可以使用constructor属性来获取对象“class”的引用:

  

<强> Object.prototype.constructor

     

返回对创建实例原型的Object函数的引用。请注意,此属性的值是对函数本身的引用,而不是包含函数名称的字符串。

所以你可以这样说:

createNewForMap: function(map) {
  var obj = new this.constructor();
  //...
}

objthis属于同一类型。

演示:https://jsfiddle.net/ambiguous/avk4z6Le/