2014-03-01 44 views
4

我正試圖在JavaScript中實現特定的語法模式。本質上,要求是用新方法擴展原生JavaScript對象的原型,並將這些方法組織到名稱空間中。我正在尋找的結果可以總結爲:是否可以將對象原型的方法組織到名稱空間中?

String.prototype.foo = { 
    bar: function() { return this.toUpperCase(); } //Fails because "this" is foo, not it's parent string 
}; 
'test'.foo.bar(); //should return 'TEST' 

我知道有其他的方式來實現類似的結果,但我真的希望上面的語法是可能的 - 儘管我80%肯定它不是。

我已經嘗試過十幾種不同的構建方法,但是我找不到任何方式將內容作爲「this」添加到bar()中。我相信問題是,因爲foo是一個對象並且沒有可執行代碼,所以編譯器無法將所有者「this」傳遞給它並從那裏傳遞給子方法,但是我想知道是否有一些模糊存在我不知道的母鏈存在的技術?下一個最好的事情可能是'test'.foo()。bar(),我沒有嘗試過,但聽起來更有可能工作。

+0

你爲什麼不嘗試呢?先試一試。 – 2014-03-01 00:54:06

+0

[組織原型javascript,同時保持對象引用和繼承](http://stackoverflow.com/q/15884096/1048572) – Bergi

回答

4

當然,在這裏你去了一個:

Object.defineProperty(String.prototype,"foo", { 
    get: function(){ 
     return { 
      bar: function(){ return this.toUpperCase() }.bind(this) 
     } 
    }, 
    enumerable: false, // don't show in for.. in loop 
    configuratble: true, 
}); 

"hello".foo.bar(); // "HELLO" 

幾件事情需要注意:

+0

可能的重複請注意,長期解決方案可能是ES7協議,但我必須承認I kind就像這個getter想法一樣。 –

+0

完美。我沒有想過嘗試吸氣劑 - 這正是我尋找的解決方案,謝謝! – wwarby

+0

@wwarby很高興我可以幫助 - 如果你想知道如何做一些很酷的事情,請讓我更新! –

0

雖然這個答案讓你的「命名空間」功能,而不是一個對象,這應該工作:

String.prototype.foo = function(){ 
    var self = this; 
    return { 
     bar: function() { return self.toUpperCase(); } 
    }; 
} 

'test'.foo().bar() 
0

你好這裏是功能

String.prototype.foo = function(){ 
    var that = this; 
    return{ 
     bar:function(){ 
      return that.toUpperCase() 
     } 
    } 
} 

'test'.foo().bar(); 

我認爲與對象的解決方案的解決方案不存在。需要注意的是1個對象可以在許多「父母」存在,所以如何決定哪一個是你要

相關問題