具有默认功能和其他功能的 Javascript 对象

Fer*_*X32 5 javascript

我正在尝试为某些东西创建自己的插件,但是在第一步时遇到了问题。我想要一个可以将参数作为默认值并在其中包含其他功能的对象。请查看下面的示例,了解我正在尝试完成的工作。

var a = function(str) { console.info(str); }
a = {
    Test: function() { console.info(TestMessage()); },
    TestMessage: function() { return "Test Message"; }
}
Run Code Online (Sandbox Code Playgroud)

基本上,我想要我可以使用参数自行调用的父对象。一个测试”); 同时,我希望该父对象中的其他函数也可以访问该对象中的其他函数。a.Test() -> 调用 a.TestMessage(),但是,不必写“a”。每次在该对象内部时。

T.J*_*der 6

你的代码的问题是你用第二个语句覆盖了 的值a。如果你想向函数a引用添加属性,你可以通过分配给它的属性来实现:

var a = function(str) { console.info(str); };
a.Test = function() { console.info(TestMessage()); };
a.TestMessage = function() { return "Test Message"; };
Run Code Online (Sandbox Code Playgroud)

现在,不是用对a新对象的引用替换函数引用,我们只是向它已经引用的函数对象添加属性。

但是请注意,在Test, 您需要限定TestMessage才能正确引用它:

a.Test = function() { console.info(a.TestMessage()); };
// --------------------------------^^
Run Code Online (Sandbox Code Playgroud)

或者,如果您可以依靠a.Test始终被调用 via a,则:

a.Test = function() { console.info(this.TestMessage()); };
// --------------------------------^^^^^
Run Code Online (Sandbox Code Playgroud)

...但前者更可靠。

现场示例:

var a = function(str) { console.info(str); };
a.Test = function() { console.info(TestMessage()); };
a.TestMessage = function() { return "Test Message"; };
Run Code Online (Sandbox Code Playgroud)


tri*_*cot 1

如果您想继续使用TestMessage不带任何前缀的简单函数引用,那么您可以以立即调用的函数表达式的格式创建一个闭包。像这样:

var a = (function () { // Immediately Invoked Function
    // Define your functions here "at ease":
    function testMessage() { 
        return "Test Message"; 
    }
    function test() { 
        console.info(testMessage()); 
    }
    function main(str) { 
        console.info(str); 
    }
    // Now assign the sub-functions to main:
    main.test = test;
    main.testMessage = testMessage;
    // And return that:
    return main;
})(); // execute immediately so to get the return value

// Test it

a('hello');
a.test();
Run Code Online (Sandbox Code Playgroud)