我需要在原型中使用函数,这些函数可以访问父对象变量而不会在创建对象时执行。
var Foo=function(e,d) {
this.b=e;
this.c=d;
// this.d will be this.b + this.c
}
window.onload=function() {
var e=4,d=7;
var bas=new Foo(e,d);
// random things happen
Foo.prototype.addFunc=function() {
// want to create d (b + c), but can't access them
}();
console.log(bas.d); // should be 11
}
答案 0 :(得分:2)
你不能像这样调用原型的方法。您只能在实例上调用该方法
var Foo=function(e,d) {
this.b=e;
this.c=d;
};
var e=4,d=7;
var bas=new Foo(e,d);
// random things happen
Foo.prototype.addFunc=function() {
this.d = this.b + this.c;
};
bas.addFunc();
alert(bas.d); // is 11
从技术上讲,您可以像这样调用函数...如果它返回一个函数本身,然后将其分配给原型。但这肯定不是你想要的
答案 1 :(得分:1)
解决您在一个语句中对所有实例调用addFunc的注释:
要在所有实例上调用某个函数,您必须跟踪所有实例。这可以在对象定义(Foo构造函数)中完成。
让Object定义(构造函数)跟踪它的所有实例有点复杂。
如果在函数中我创建了100个Foo实例并且函数退出,则这些实例将超出范围。但是因为Foo会跟踪它的实例,它会引用这些实例,因此即使在函数退出后这些实例也不会被垃圾收集(超出范围)。
要向Foo表明不再需要这些实例,您必须在实例上显式调用destroy,以便不再在Foo._instances中保留对该实例的引用。
以下是一些要演示的代码:
//Object definition of Foo (constructor function)
var Foo=function(e,d) {
this.b=e;
this.c=d;
//saving this instance in Foo._instances
this._instanceId=Foo._instanceCount;
Foo._instances[this._instanceId]=this;
Foo._instanceCount++;
}
//properties of the Object definition
Foo.allAddFunc=function(){
var thing;
for(thing in Foo._instances){
if(Foo._instances.hasOwnProperty(thing)){
Foo._instances[thing].addFunc();
}
}
};
//container for all instances of Foo
Foo._instances={};
//does not refllect the actual count
// used to create _instanceId
Foo._instanceCount=0;
//prototype of Foo (used for foo instances)
Foo.prototype.addFunc=function() {
this.d=this.b+this.c;
};
//when a Foo instance is no longer needed
// you should call destroy on it
Foo.prototype.destroy=function(){
delete Foo._instances[this._instanceId];
};
(function() {
var bas=new Array(10),i=0,len=bas.length;
//create instances
for(;i<len;i++){
bas[i]=new Foo(i,i*2);
};
//do something with all instances
Foo.allAddFunc();
//bas[] will go out of scope but all instances of
// Foo will stay in Foo_instances, have to explicitely
// destroy these instances
for(i=0,len=bas.length;i<len;i++){
console.log("bas.d at "+i+":",bas[i].d);
//Foo instance at bas[i] no longer needed
// destroy it
bas[i].destroy();
};
}());