当尝试调用另一个对象而不是我正在调用的对象中的函数时,我收到以下错误:'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
}
}
答案 0 :(得分:1)
当需要定义变量时,这是的范围和理解的好教训。
让我们从最简单的一点开始:
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
和ObjectTwo
,这些尚未定义...所以你得到一个不同的错误:
TypeError:对象原型可能只是一个Object或null。
关键是让一切都在正确的范围和正确的顺序。这对于javascript来说可能有点微妙,因为在评估对象或调用函数时需要定义对象,这不一定是脚本加载的同时。像unload
处理程序这样的javascript中的很多东西是异步发生的,这意味着整个脚本运行,然后 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)
答案 1 :(得分:0)
为了尝试解决我遇到的问题,我将Object实例移动到了全局范围(在window.onload之上),我收到了错误Object prototype may only be an Object or null: undefined
我遇到的根本问题;但是,主要集中在window.onload函数之前没有声明ObjectOne和ObjectTwo。在我这样做并将实例化移动到全局范围后,我没有收到任何错误。感谢@ Nish26指出我正确的方向。
var ObjectOne = {
one_A : function(){
ObjectTwoInstance.two_A();
}
}
var ObjectTwo = {
two_A : function(){
//do something
alert("two_A")
}
}
var ObjectOneInstance = Object.create(ObjectOne);
var ObjectTwoInstance = Object.create(ObjectTwo);
window.onload = function() {
ObjectOneInstance.one_A();
}