我正在尝试创建自己的插件,但是,第一步遇到了麻烦。我想有一个对象,可以将参数作为默认参数,并在其中也有其他功能。请查看下面的示例,了解我要完成的任务。
var a = function(str) { console.info(str); }
a = {
Test: function() { console.info(TestMessage()); },
TestMessage: function() { return "Test Message"; }
}
基本上,我想要一个我可以用参数自己调用的父对象。一个("测试&#34);同时,我希望该父对象中的其他函数也可以访问该对象中的其他函数。 a.Test() - >然而,调用a.TestMessage(),不必写" a。"每次进入那个物体时。
答案 0 :(得分:3)
您的代码存在的问题是您使用第二个语句覆盖 a
的值。如果要为a
引用的函数添加属性,可以通过分配属性来实现:
var a = function(str) { console.info(str); };
a.Test = function() { console.info(TestMessage()); };
a.TestMessage = function() { return "Test Message"; };
现在,我们不是使用对新对象的引用替换a
中的函数引用,而是仅向已引用的函数对象添加属性。
请注意,在Test
内,您需要限定TestMessage
才能正确引用它:
a.Test = function() { console.info(a.TestMessage()); };
// --------------------------------^^
或者如果您可以依靠a.Test
始终通过a
进行调用,那么:
a.Test = function() { console.info(this.TestMessage()); };
// --------------------------------^^^^^
......但前者更可靠。
直播示例:
var a = function(str) { console.info(str); };
a.Test = function() { console.info(a.TestMessage()); };
a.TestMessage = function() { return "Test Message"; };
a("Direct");
a.Test();

答案 1 :(得分:1)
您还可以使用揭示模块模式。
仅公开您实际计划调用的功能。 辅助函数可以保留在对象内部,而无法从外部访问它们。
您还可以将初始str值保存在局部变量中,例如var string = str;并在你的功能中使用它
function A ( str ) {
console.info( str );
function test( ) {
console.info( testMessage( ) );
}
function testMessage( ) {
return "Test Message";
}
return {
test: test
}
}
var a = new A( "testing" );
a.test();
答案 2 :(得分: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();

答案 3 :(得分:0)
您始终可以返回可以具有任意数量功能的Object。函数使用this
调用其对象的另一个函数。
我添加了一个非常简单的代码片段来解释这一点,如有任何澄清,请通知我。
var parent = createParent();
parent.callAllFunction();
function createParent() {
return ParentConstructor();
}
function ParentConstructor() {
var obj = {};
obj.function1 = function1;
obj.function2 = function2;
obj.function3 = function3;
obj.function4 = function4;
obj.callAllFunction = callAllFunction;
function function1() {
console.log('called function1');
}
function function2() {
console.log('called function2');
}
function function3() {
console.log('called function3');
}
function function4() {
console.log('called function4');
}
function callAllFunction() {
this.function1();
this.function2();
this.function3();
this.function4();
}
return obj;
}
当你正在编写插件时,你应该总是将你的对象/模块与主引用隔离开来,以使它们更加可重用和干净。