使用Javascript中使用相同函数构造函数创建的所有对象实例的数组

时间:2011-09-06 18:42:38

标签: javascript object constructor

尝试在构造函数中构建一个具有内在适当性的对象,该对象使数组与使用相同构造函数创建的所有对象保持一致。

我认为最好的方法是关闭对象初始化,这就是我尝试解决这个问题的方法:


    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 个答案:

答案 0 :(得分:5)

将数组作为属性放在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"]

或者,如果您希望对Array进行更多保护,请使用模块模式,并在原型上包含一个函数以返回Array。

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 :(得分:1)

您可以将数组作为myObject的静态成员:

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

我看不到你在哪里打init()。我在构造函数中添加了对init()的调用。

答案 2 :(得分:1)

在我看来,这样做很容易:

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

答案 3 :(得分:0)

这会吗?

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