2013-04-05 38 views
1

我在canvas中爲JavaScript創建一個小Shape類以殺死一些時間。我在想,如果我能像下面做一些事情,Javascript字符串是一個原型函數?

var Shape = function (shape) { 

    // pseudo code 
    if (shape is a prototype function of Shape) { 
     shape(); 
    } 
} 

Shape.prototype.quad = function() { 

} 

所以,對上面的唯一有效的字符串將是quad因爲這是唯一定義的原型功能。

這可能嗎?

+0

此問題應該是http://stackoverflow.com/q/1098040/218196的副本。此外,您可能需要檢查屬性是否爲函數。 – 2013-04-05 23:03:07

+0

我試圖用相同的標題搜索相關問題,但沒有出現。我的JavaScript知識不是很好,知道它會涉及到一個數組問題。感謝您檢查是否是功能。 – GriffLab 2013-04-05 23:23:06

回答

2

鑑於shape是一個字符串,只需使用in,看它是否存在於Shape.prototype

var Shape = function (shape) { 
    if (shape in Shape.prototype) { 
     Shape.prototype[shape](); 
    } 
}; 

這當然不會給你一個有用的this值在Shape.prototype.quad,但我不能告訴你想要什麼。


如果你打算這樣做,因爲構造函數,那麼你會用this代替。

var Shape = function (shape) { 
    if (shape in this) { 
     this[shape](); 
    } 
}; 

如果你想也做出一定的,這是一個函數,然後使用typeof

if ((shape in this) && typeof this[shape] === "function") { 
    this[shape](); 
} 
+0

這回答我的問題,謝謝。我基本上做了一個'Shape'類,人們可以傳入一個字符串,它會調用相對原型函數。所以'var shape = new Shape(「quad」);'會調用函數來創建一個四邊形形狀,再次感謝您! – GriffLab 2013-04-05 23:24:49

+0

不客氣。 – 2013-04-05 23:25:23

0

jsFiddle Demo

我想你要找的是遺傳檢測。這可以通過檢查instanceof來完成。這裏有一個例子:

var Shape = function (shape) { 
if(shape instanceof Shape){ 
    alert("shape instance found"); 
} 
}; 

var Quad = function(){}; 
Quad.prototype = new Shape(); 

var q = new Quad(); 
var s = new Shape(q); 

編輯

jsFiddle Demo

也許你想尋找一個字符串定義的原型?在這種情況下,這樣做:

var Shape = function (shape) { 
if(typeof this[shape] == "function"){ 
    alert("shape is a prototype function"); 
} 
}; 
Shape.prototype.quad = function(){}; 

var c = new Shape("circle"); 
var q = new Shape("quad"); 
+0

Mmh,我解釋*「因此,對於上述唯一有效的字符串將是」quad「,因爲這是唯一定義的原型函數。」*不同。 – 2013-04-05 23:07:56

+0

@FelixKling - 這只是我最好的猜測,我認爲這個例子至少會提供一些我從psuedo代碼中看到的上下文(在我看來,像是通過繼承檢測來檢查多態性,即形狀是因爲它從Shape繼承而來)。 – 2013-04-05 23:12:59

+0

這就是我最初想到的,但他的問題表明*字符串*正在被傳入。有沒有比'eval(「Shape.prototype。」+ shape)instanceof Shape'更好的方法? :-( – MattDiamant 2013-04-05 23:13:35

0

試試這個假設形狀是一個構造,它採用無標準,但通常可用財產。

var Shape = function (shape) { 
    for (var functionName in this) { 
     if (this.__proto__.hasOwnProperty(functionName)) {  
      if (this[functionName] === shape) { 
       shape.call(this); 
      } 
     }    
    } 
} 

Shape.prototype.quad = function() { console.log("quad")} 
new Shape(Shape.prototype.quad)