如何将用户定义的属性传递给可能不存在的Javascript对象?

时间:2014-05-08 02:11:41

标签: javascript

我有一个全局对象SomeObj(使用揭示模块模式),在//url/to/js/file.js中定义 SomeObj包含两个setter方法:SomeObj.setX()SomeObj.setY(),在SomebObj内部设置一些私有变量(X和Y)。除非通过我通过显示模块模式公开的这些set方法,否则无法访问私有变量X和Y.

我有另一个名为SomeObj.render()的方法,它使用X和Y变量。

所以,这是场景。另一位开发人员将在第三方回调函数中调用SomeObj.render()

function thirdPartyCallbackFunction() {
    $.getScript("//url/to/js/file.js", function() {
         SomeObj.render();
    });
}

此代码位于专有CMS中。但是,在用例中,我们的用户应该能够调用SomeObj.setX()SomeObj.setY()来设置SomeObj.render()所需的变量。但是,由于CMS的设计方式,用户无权修改function thirdPartyCallbackFunction()所在的内容区域。

事实上,可以调用SomeObj.setX()SomeObj.setY()的内容区域可以位于function thirdPartyCallbackFunction()之前或之后。如果内容区域位于function thirdPartyCallbackFunction()之前,则尚未定义SomeObj,并且会发生错误。

有没有办法在定义.setX()之前调用.setY()SomeObj?或者我应该采用另一种方法吗?

2 个答案:

答案 0 :(得分:1)

假设您无法控制CMS输出,可能以下内容可能有所帮助。

在窗口对象中设置“X”和“Y”变量。

window.MyArguments = {};
window.MyArguments.X = 'whatever_is_x';
window.MyArguments.Y = 'whatever_is_y';

执行回调后,如果存在“MyArguments”,则可以更新值并调用渲染。

function render() {
    if(window.MyArguments && window.MyArguments.X && window.MyArguments.Y) {
        SomeObj.setX(window.MyArguments.X);
        SomeObj.setY(window.MyArguments.Y);
        SomeObj.render();
    } else {
      //Set a time-out and call the same function again.
    }
}

你可以在你的回调中调用这个新的“渲染”功能。

function thirdPartyCallbackFunction() {
    $.getScript("//url/to/js/file.js", function() {
         render();
    });
}

您也可以尝试相反的方法,在调用其上的方法之前检查SomeObj是否可用,然后设置超时(如果它尚不可用)。

还可以选择“密封”和“开封”模式,以便部分更新模块的定义。

答案 1 :(得分:1)

我给了Serendipity这个答案的功劳。根据Serendipity关于使用全局变量的答案,我决定改为创建一个全局函数声明。

function configureSomeObj() {
  SomeObj.setX();
  SomeObj.setY();
}

尽管在读取此函数时可能尚未定义SomeObj,但在调用此函数之前,不会对此函数进行全面评估。

我调整了第三方回调:

function thirdPartyCallbackFunction() {
    $.getScript("//url/to/js/file.js", function() {
        configureSomeObj();
        SomeObj.render();
    });
}

现在,configreSomeObj()可以在thirdPartyCallbackFunction()之前或之后的页面上的任何位置。这确实引入了一个全局函数,但其​​中的代码是有组织的。