当尝试调用位于另一个对象中的函数而不是我正在调用的对象时,我收到以下错误:“未定义 ObjectOneInstance。”
我知道一种选择是插入语句
ObjectOneInstance.ObjectTwoInstance = ObjectTwoInstance;
(反之亦然)更改函数以调用类似
this.ObjectTwoInstance.two_A();
.
这种方式似乎工作得很好,但我想知道是否有一种不同的方式在 JavaScript 领域被认为更好或更合适,因为后一个例子似乎不正常且令人困惑。
最近我一直在努力让我的 Javascript 更加面向对象,这可能引起了一些误解,当应用程序变得更加复杂时,面向对象的 JavaScript 是如何构建的。
window.onload = function() {
var ObjectOneInstance = Object.create(ObjectOne);
var ObjectTwoInstance = Object.create(ObjectTwo);
ObjectOneInstance.one_A();
}
var ObjectOne = {
one_A : function(){
ObjectTwoInstance.two_A();
}
}
var ObjectTwo = {
two_A : function(){
//do something
}
}
这是关于何时需要定义变量的范围界定和理解的好课。
让我们从最简单的一点开始:
window.onload = function() {
var ObjectOneInstance = Object.create(ObjectOne);
var ObjectTwoInstance = Object.create(ObjectTwo);
ObjectOneInstance.one_A();
}
在 javascript 中创建的变量var
的作用域是封闭的函数。这意味着ObjectOneInstance
和ObjectTwoInstance
仅在您刚刚创建的函数中可用。在此功能之外,它们不存在。
为了解决这个问题,您可以将声明移到函数之外,让所有人都可以看到它们,但有一个问题:
/* BUT THIS DOESN'T WORK…FOR A DIFFERENT REASON */
var ObjectOneInstance = Object.create(ObjectOne);
var ObjectTwoInstance = Object.create(ObjectTwo);
window.onload = function() {
ObjectOneInstance.one_A();
}
现在ObjectOneInstance
和ObjectTwoInstance
处于一切都可以看到它们的范围内,但它们依赖于尚未定义的ObjectOne
and ObjectTwo
……所以你会得到一个不同的错误:
类型错误:对象原型只能是一个对象或 null。
关键是让一切都在正确的范围内和正确的顺序。这对于 javascript 来说可能有点微妙,因为需要在评估对象或调用函数时定义对象,这不一定与脚本加载的时间相同。在像JavaScript很多事情unload
处理同步发生,这意味着整个脚本运行,并随后在onload
处理火灾。这不应该抛出错误:
window.onload = function() {
/* ObjectOneInstance is not defined when the script loads,
but it will be when onload is called */
ObjectOneInstance.one_A();
}
var ObjectOne = {
one_A : function(){
/* It doesn't matter that ObjectTwoInstance is not defined yet;
it will be by the time this function is called */
ObjectTwoInstance.two_A();
}
}
var ObjectTwo = {
two_A : function(){
//do something
}
}
/* Object create is not in an async handler it runs right away,
so ObjectOne and ObjectTwo need to be defined before calling this */
var ObjectOneInstance = Object.create(ObjectOne);
var ObjectTwoInstance = Object.create(ObjectTwo)
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句