2015-10-05 124 views
0

我正在玩JS「oop」(或者我應該說「pop」 - 原型導向編程?),並試圖做類似靜態方法和函數的操作。我可以從原型對象調用函數,但這不完全是靜態函數,是嗎?在不創建新對象的情況下調用公共函數JS

我有代碼:

function a(val){ 
    this.val = val; 
    console.log(this); 
    this.foo = function(){ 
    console.log('hi'); 
    } 
} 

,我想調用foo的功能,而無需創建一個新的對象。這樣的事情有可能嗎?我該怎麼做?

+0

函數也是對象 – 2015-10-05 08:04:47

回答

0

正如您所寫,您不能在沒有實例化a的情況下致電foo

你能做的最好的就是隱藏物體的像這樣的實例:

var a = { 
    foo: function() { 
    console.log('hi'); 
    } 
}; 

由於考慮到仿真靜態函數,這是最接近你可以來:

function A(val) { 
    this.val = val; 
    console.log(this); 
} 

A.prototype.foo = function() { console.log('hi'); }; 

你做在這一點上不需要實例化A來調用foo。

A.prototype.foo(); // 'hi' 
+0

如果不是在嚴格模式下,可以在調用'a()'後調用'foo()'; (不需要instanciate a) – Hacketo

+0

好的,好點。 – Ben

1

如果你想模仿靜態函數,你需要在創建「下課」後添加方法:

function A(val) { 
    this.val = val; 
} 

A.foo = function() { 
    console.log('hi'); 
} 

然後就可以調用A.foo();而無需使用原型。這很像Object.keys的工作方式。這使得它成爲函數的一個屬性,而不是實例的屬性,比如靜態函數。

+0

我認爲這是@ marius-balaj暗示的。 –

+0

好吧,這很有趣......它與靜態函數非常相似,但它不能包含只能由該類更改的私有值。這是我得到的最接近的解決方案: 'function a(val){ this.foo = function(){ console.log('hi'); } } a.val =(函數(){ 變種X = 0; 返回{ INC:函數(){ X ++;} , 得到:函數(){ 返回X; } }; })(); a.val.inc(); a.val.inc(); a.val.inc(); a.val.get();' – JDo

相關問題