2011-12-24 135 views
3

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

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

第一个警报给“你好”,第二个不确定...

我understant“这”在javascript是对象的调用函数,而不是实例本身的身份...我认为,当调用funcB,我在某种父变体不存在的上下文...

我是一个纯粹的JavaScript新手,我不知道如何解决这个问题。当然,我可以把它作为agument,但它不是很OOP,并在我的项目,也有很多变量,使可获取的......

感谢

回答

0

使用基于原型的继承,你不能从父级访问在子级中声明的属性。请参阅Mozilla的开发人员本指南:

https://developer.mozilla.org/en/JavaScript/Guide/Inheritance_constructor_prototype和具体在哪里,它说:“属性查找如下原型链共享一个共同的原型链共享公共属性的所有对象”

孩子与母公司共享整个“共同原型链”,但反之亦然。这并不意味着可能没有其他的方法来完成你正在尝试的东西,但是基于原型的继承可能不是那种方式。

1

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

正如您所看到的,问题不在于您的继承链,而在于您想如何从funcB函数访问this。通过做foo()调用函数与调用obj.foo()this.foo()不一样。 this的值取决于您如何调用该函数。当你做obj.foo()this将是obj。但是,如果您拨打foo(),则this的值将是window对象。

您可以通过使用Function.prototype.callFunction.prototype.apply所以写foo.call(obj)改变函数内的this值(现在thisobj)。考虑到这一点你的代码看起来就像这样:

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

而且,请注意,属性名不能在旧的浏览器是保留字(例如,“VAR”)。

1

当函数调用等funcB(),函数“”将是窗口对象的内部。所以通常一个代理变量用于对象的实例。在下面你可以看到如何去做。

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

太好了。谢谢你的答案 – Robert 2011-12-30 10:48:36