尝试在构造函数中构建一个具有内在适当性的对象,该对象使数组与使用相同构造函数创建的所有对象保持一致。
我认为最好的方法是关闭对象初始化,这就是我尝试解决这个问题的方法:
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)
答案 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);