从父函数访问实例变量

时间:2011-12-24 12:42:48

标签: javascript inheritance

我有一个从另一个继承的对象。在子对象中,我初始化了一些实例变量。在父对象中,我有一个方法来调用使用这些实例变量的私有函数。

function objA() {
  this.funcA = function() {
    alert(this.var);
    funcB();
  };
  function funcB() {
    alert(this.var);
  };
}

objB.prototype = new objA();
objB.prototype.constructor = objB;
function objB() {
  this.var ="hello";
  this.funcA();
}

第一个警报给出“你好”,第二个未定义......

我明白javascript中的'this'是调用函数的对象的身份,而不是实例本身......我假设在调用funcB时,我在某种父变量不存在的父上下文中...

我是一个纯粹的javascript新手,我无法弄清楚如何解决这个问题。当然,我可以将它作为文章传递,但它不是非常OOP,并且在我的项目中,还有更多的变量可供使用......

由于

3 个答案:

答案 0 :(得分:1)

请不要滥用JavaScript在使用后定义函数的能力。读这样的代码真的很难。

正如您所注意到的,问题不在您的继承链中,而在于您希望如何从this函数访问funcB。通过foo()调用函数与调用obj.foo()this.foo()不同。 this的值取决于您如何调用该函数。当您执行obj.foo() thisobj。但是,如果您致电foo(),则this的值将是window对象。

您可以使用Function.prototype.callthis更改函数内Function.prototype.apply的值,以便foo.call(obj)(现在this objfunction objA() { function funcB() { alert(this.var); } this.funcA = function() { alert(this.var); funcB.call(this); // <- notice .call() }; } function objB() { this.var ="hello"; this.funcA(); } objB.prototype = new objA(); objB.prototype.constructor = objB; })。考虑到这一点,您的代码将如下所示:

{{1}}

另外,请记住,旧版浏览器中的属性名称不能是保留字(例如“var”)。

答案 1 :(得分:1)

当像 funcB()一样调用该函数时,在函数内部这个&#39;将是Window对象。因此通常将代理变量用于对象的实例。下面你可以看到如何做到这一点。

function objA() {

  var _this;

  this.super = function(){
    _this = this;  
  }

  this.funcA = function() {
    alert(this.var);
    funcB();
  };

  function funcB() {
    alert(_this.var);
  };
}

objB = function objB() {
  this.super();
  this.var ="hello";
  this.funcA();
}

objB.prototype = new objA();

var b = new objB();

答案 2 :(得分:0)

使用基于原型的继承,您无法从父级访问子级中声明的属性。请参阅Mozilla的开发者指南:

https://developer.mozilla.org/en/JavaScript/Guide/Inheritance_constructor_prototype,具体说到:

“属性查找遵循原型链。共享公共原型链的所有对象共享公共属性。”

孩子与父母共享整个“公共原型链”,但反之亦然。这并不意味着可能没有其他方法可以实现您的尝试,但是,基于原型的继承可能不是那样。

相关问题