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

时间:2017-02-11 15:06:40

标签: javascript

我正在尝试创建自己的插件,但是,第一步遇到了麻烦。我想有一个对象,可以将参数作为默认参数,并在其中也有其他功能。请查看下面的示例,了解我要完成的任务。

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

基本上,我想要一个我可以用参数自己调用的父对象。一个("测试&#34);同时,我希望该父对象中的其他函数也可以访问该对象中的其他函数。 a.Test() - >然而,调用a.TestMessage(),不必写" a。"每次进入那个物体时。

4 个答案:

答案 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;
}

当你正在编写插件时,你应该总是将你的对象/模块与主引用隔离开来,以使它们更加可重用和干净。