2017-02-11 92 views
2

我想創建自己的插件,但是,第一步遇到問題。我想要一個可以將參數作爲默認參數的對象,並在其中具有其他函數。請看下面的例子,我正在努力完成。具有默認功能和其他功能的Javascript對象

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

基本上,我想要父對象,我可以自己調用一個參數。一個測試」);同時,我希望該父對象內的其他函數也可以訪問該對象內的其他函數。 a.Test() - >調用a.TestMessage(),但不必編寫「a」。每次都在這個物體裏面。

回答

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

與您的代碼的問題是你覆蓋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();

+0

我知道了,謝謝。這是一個大插件的最佳方法嗎?我在想像我會封裝它,就像它會是一個大對象,裏面會有所有可以調用對方的子功能,而不必寫這個或父母的名字。我的意思是,如果這種方式對於一個大插件來說沒問題的話,那麼我對它就沒問題。 – FerX32

+0

@AAA:聽起來你真正想要的是「揭示模塊模式」,在這裏你使用了一個IIFE,它內部有私有函數,可以無限制地互相調用,並讓它返回一個帶有外部接口的對象。 –

+0

是的,這聽起來有點像它(但是,有沒有辦法用這種模式做「默認」?像這樣的:http://stackoverflow.com/questions/5647258/how-to-use-揭示模塊模式在JavaScript中,也許我可以做些像揭露=功能(str),並顯示(「直接」),它可以做「if(str!= undefined){console.info(str); return ;} ..你認爲呢? – FerX32

0

您隨時可以返回它可以有任意數量的功能的對象。一個函數使用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() { 
 
    \t console.log('called function1'); 
 
} 
 

 
function function2() { 
 
    \t console.log('called function2'); 
 
} 
 

 
function function3() { 
 
    \t console.log('called function3'); 
 
} 
 

 
function function4() { 
 
    \t console.log('called function4'); 
 
} 
 

 
function callAllFunction() { 
 
\t this.function1(); 
 
\t this.function2(); 
 
\t this.function3(); 
 
    this.function4(); 
 
} 
 
    
 
return obj; 
 
}

而當你正在編寫一個插件,你應該總是隔離主引用你的對象/模塊,以使他們的可重用性和乾淨。

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();