2016-06-18 35 views
1

我有一個JavaScript類的函數:JavaScript類 - 訪問在飛行

MyClass = function(){ 
    this.m_SomeData = 5; 
}; 

,我已經創造了一些功能,該類:

MyClass.prototype.MyClassFunction_1 = function(arg){ 
    // Some stuff that can return false 
    return true; 
}; 
MyClass.prototype.MyClassFunction_2 = function(arg){ 
    // Some stuff that can return false 
    return true; 
}; 
MyClass.prototype.MyClassFunction_3 = function(arg){ 
    // Some stuff that can return false 
    return true; 
}; 

後來我創建的實例那個班。 (他們可以合併成一個單一的功能,但有設計問題,使它更好地分開它們):

var myInstance = new MyClass(); 

現在棘手的一點。在'if'聲明中,我正在執行以下操作(以及其他內容)。

var funcUse; 
var arg = 3; // Some value created at run time) 
if((funcUse = val === 0 ? MyClassFunction_1 
         : (val === 1 ? MyClassFunction_2 : MyClassFunction_3)) !== "undefined" && 
    myInstance.funcUse(arg)){ 
} 

顯而易見的問題是'if'語句MyClassFunction_?都是未定義的,因爲它們應該綁定到類的一個實例,例如myInstance.MyClassFunction_ ?.

那麼如何在if語句中做到這一點呢?

+2

方法只是具有函數值的屬性。你也可以爲它們使用括號。 – Bergi

+0

這不是一個類,這是一個功能。 – melpomene

+0

嗨@Bergi,你能解釋一下你的意思嗎? (@melpomene - 這是您在javascipt中創建類的一種方法。) – Rewind

回答

2

你可以這樣做:

var funcUse = 
    val === 0 ? 'MyClassFunction_1' : 
    val === 1 ? 'MyClassFunction_2' : 
    'MyClassFunction_3'; 

if (myInstance[funcUse] && myInstance[funcUse](arg)) { 
    ... 
} 

點標記(obj.property)僅僅是obj["property"]語法糖,這樣你就可以簡單地funcUse的字符串。


或者,你也可以這樣做:

var funcUse = 
    val === 0 ? myInstance.MyClassFunction_1 : 
    val === 1 ? myInstance.MyClassFunction_2 : 
    myInstance.MyClassFunction_3; 

if (funcUse && funcUse.call(myInstance, arg)) { 
    ... 
} 

此提取從myInstance對象的功能,但你必須要小心調用funcUse確保myInstance作爲this通過。

1

不要擔心「類」 /繼承,要解決的問題實際上是兩個更加簡單的,

  1. 訪問的對象動態
  2. 選擇的屬性上下文功能

的/ this你有一對夫婦選擇哪些patte RN使用


fn.call/fn.apply

var o = {foo: 'bar'}; 

function fizz() {return this;} 

fizz.call(o); // returns `o`, Object {foo: 'bar'} 

括號標記

var o = {foo: function() {return this}}; 

o['foo'](); // returns `o` 

在您的特定情況下,我可能會用switch..case或0123去模式來決定屬性名稱,然後用括號表示調用;

var method; 
switch (val) { 
    case 0: method = 'foo'; break; 
    case 1: method = 'bar'; break; 
} 

if (method) 
    o[method](); 
+0

感謝您提供豐富的信息。我首先看到了melpomene的答案和剔號。但再次感謝。 – Rewind