如何从原型方法创建对象的实例

How to create instance of object from prototype method

本文关键字:创建对象 实例 方法 原型      更新时间:2023-09-26

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

例如,如果我有:

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);

并且使modelClassOneClassTwo的实例。

可以在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>

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

对象.原型.构造函数

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

所以你可以说:

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

并且CCD_ 8将是与CCD_。

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