我有一个从另一个继承的对象。在子对象中,我初始化了一些实例变量。在父对象中,我有一个方法来调用使用这些实例变量的私有函数。
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,并且在我的项目中,还有更多的变量可供使用......
由于
答案 0 :(得分:1)
请不要滥用JavaScript在使用后定义函数的能力。读这样的代码真的很难。
正如您所注意到的,问题不在您的继承链中,而在于您希望如何从this
函数访问funcB
。通过foo()
调用函数与调用obj.foo()
或this.foo()
不同。 this
的值取决于您如何调用该函数。当您执行obj.foo()
this
时obj
。但是,如果您致电foo()
,则this
的值将是window
对象。
您可以使用Function.prototype.call和this
更改函数内Function.prototype.apply
的值,以便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;
})。考虑到这一点,您的代码将如下所示:
{{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,具体说到:
“属性查找遵循原型链。共享公共原型链的所有对象共享公共属性。”
孩子与父母共享整个“公共原型链”,但反之亦然。这并不意味着可能没有其他方法可以实现您的尝试,但是,基于原型的继承可能不是那样。