如何在函数内访问父对象的变量

时间:2013-11-06 12:56:01

标签: javascript function prototype

我需要在原型中使用函数,这些函数可以访问父对象变量而不会在创建对象时执行。

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
}

2 个答案:

答案 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();
    };    
}());

关于原型:https://stackoverflow.com/a/16063711/1641941