我正在尝试为某些东西创建自己的插件,但是在第一步时遇到了问题。我想要一个可以将参数作为默认值并在其中包含其他功能的对象。请查看下面的示例,了解我正在尝试完成的工作。
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”。每次在该对象内部时。
你的代码的问题是你用第二个语句覆盖了 的值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)
如果您想继续使用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)