Javascript 从父函数访问实例变量
我有一个从另一个继承的对象。在子对象中,我初始化了一些实例变量。在父对象中,我有一个方法调用使用这些实例变量的私有函数Javascript 从父函数访问实例变量,javascript,inheritance,Javascript,Inheritance,我有一个从另一个继承的对象。在子对象中,我初始化了一些实例变量。在父对象中,我有一个方法调用使用这些实例变量的私有函数 function objA() { this.funcA = function() { alert(this.var); funcB(); }; function funcB() { alert(this.var); }; } objB.prototype = new objA(); objB.prototype.constructor
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新手,我不知道如何解决这个问题。当然,我可以把它作为一个变量传递,但它不是很面向对象的,在我的项目中,有很多变量可以使用
感谢使用基于原型的继承,您无法从父级访问子级中声明的属性。请参阅Mozilla的开发者指南: 特别是它说: “属性查找遵循原型链。共享公共原型链的所有对象都共享公共属性。”
子对象与父对象共享整个“公共原型链”,但不是相反。这并不意味着可能没有其他方法来完成您正在尝试的任务,但是,基于原型的继承可能不是这样。请不要滥用JavaScript在使用函数后定义函数的能力。读这样的代码真的很难 正如您所注意到的,问题不在于继承链,而在于如何从
funcB
函数访问this
。通过执行foo()
调用函数与调用obj.foo()
或this.foo()
不同。此
的值取决于调用函数的方式。当您执行obj.foo()
时,这将是obj
。但是如果调用foo()
则this
的值将是窗口
对象
您可以通过使用和function.prototype.apply
在函数内部更改this
的值,因此编写foo.call(obj)
(现在this
将成为obj
)。考虑到这一点,您的代码将如下所示:
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;
函数objA(){
函数funcB(){
警报(this.var);
}
this.funcA=函数(){
警报(this.var);
funcB.call(this);//当调用函数时,如funcB(),函数中的“this”将是窗口对象。因此,通常对对象的实例使用代理变量。下面您可以看到如何执行此操作
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();
太好了,谢谢你的回答