Массив со всеми Экземплярами Объектов, созданными с одним и тем же конструктором функций в Javascript - PullRequest
3 голосов
/ 06 сентября 2011

При попытке построить объект с внутренним свойством в функции конструктора, которая сохраняет массив со всеми объектами, созданными с помощью одного конструктора.

Я думаю, что лучше всего было бы с закрытием инициализации объекта, и вот как я пытаюсь решить это:


    function myObject (name){
        this.name=name;
        this.allInstances = [];
        }

    myObject.ptototype = {

        init : function(){
            return function(){this.allInstances.push(this.name)};
            }(),
        }   

    object1 = new myObject("object1");
    object2 = new myObject("object2");
    console.log(object1.allInstances); // should print ["object1", "object2"]

Кто-нибудь знает, как этого добиться? Это вообще возможно?
Я специально пытаюсь найти решение, которое использует только конструктор функций и прототип для достижения этой цели.

Я знаю, как решить эту проблему, передавая свойства во внешний массив, например:


    var allInstances = [];
    function myObject (name){
        this.name=name;
        allInstances.push(this.name);
        }
    console.log(allInstances)

Ответы [ 4 ]

5 голосов
/ 06 сентября 2011

Поместите массив как свойство на prototype, и он будет использоваться всеми экземплярами:

function myObject(name) {
    this.name = name;
    this.allInstances.push( this.name );
}

myObject.prototype.allInstances = [];

object1 = new myObject("object1");
object2 = new myObject("object2");

console.log(object1.allInstances); // ["object1", "object2"]

Или, если вы хотите, чтобы массив был более защищенным, используйте шаблон модуля ивключите функцию в прототип для возврата массива.

var myObject = (function() {
    var allInstances = [];

    function func(name) {
        this.name = name;
        allInstances.push( this.name );
    }

    func.prototype.getAllInstances = function() { return allInstances; };

    return func;
})();

object1 = new myObject("object1");
object2 = new myObject("object2");

console.log(object1.getAllInstances()); // ["object1", "object2"]
1 голос
/ 06 сентября 2011

Мне кажется, это легко сделать так:

 var MyType = function(name)
 {
      this.name = name;
      MyType.Instances.push(this.name);
 };

 MyType.Instances = [];

 MyType.prototype.getInstances = function()
 {
     return MyType.Instances;
 };

 var obj = new MyType('Hello');
 var obj2 = new MyType('hello 2');

 console.log(obj2.getInstances());
1 голос
/ 06 сентября 2011

Вы можете поместить свой массив как статический член myObject:

function myObject (name) {
    this.name=name;
    this.init();
}
myObject.allInstances = [];
myObject.prototype = {
    init: function() {
        myObject.allInstances.push(this.name);
    }
};

Я не вижу, куда вы звоните init().Я добавил вызов к init() в конструкторе.

0 голосов
/ 06 сентября 2011

Будет ли это делать?

function myObject(name) {
    this.name = name;
    this.constructor.allInstances.push(this.name);
}

myObject.allInstances = [];

object1 = new myObject("object1");
object2 = new myObject("object2");
console.log(myObject.allInstances);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...