2015-12-23 5 views
2

Возможно ли создать экземпляр объекта из его прототипа, если прототип используется для нескольких подклассов?Как создать экземпляр объекта из метода прототипа

Например, если у меня есть:

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

'вар модель = новый ClassOne()' 'затем model.createNewForMap (карта)'? – AdamJeffers

+0

Почему вы не можете просто создавать новые классы ClassOne() и 'new ClassTwo()' для создания своих экземпляров ..? –

+0

@TJ Или просто используйте ['constructor'] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/constructor), если у вас есть только экземпляр. –

ответ

0

Можно определить статический метод на BaseClass, который будет служить для него фабричной функцией или любыми дочерними классами, которые наследуют ее.

Backbone.Model.extend позволяет указать так называемый classProperties, что может рассматриваться как нечто похожее на статические методы из консервативного программирования ООП.

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>

0

Вы можете использовать constructor свойство, чтобы получить ссылку на "класс" объекта:

Object.prototype.constructor

Возвращает ссылку к функции Object, которая создала прототип экземпляра. Обратите внимание, что значение этого свойства является ссылкой на саму функцию, а не на строку, содержащую имя функции.

Так что вы можете сказать что-то вроде:

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

и obj будет тот же тип вещи, как this.

Демо: https://jsfiddle.net/ambiguous/avk4z6Le/

Смежные вопросы