String.prototype.contains = function(str) {
return this.indexOf(str) !== -1;
};
此代碼段的確擴展了String.prototype
。
它與函數調用如'foobar'.contains('foo')
;
但是,如果它作爲一個函數傳遞,而不是調用它,它不能很好地工作:將函數綁定到String.prototype,因此它總是綁定到字符串
var str = 'foobar';
['foo', 'bar'].every(str.contains);
TypeError: Object [object global] has no method 'indexOf'
我知道你可以這樣做:
['foo', 'bar'].every(str.contains.bind(str));
或類似的東西:
['foo', 'bar'].every(function(item) { return str.contains(item); });
但他們只是讓我感到尷尬。
在Constructor
功能我創建的,雖然它不以這種方式工作:如果有一種方法來
function Foo(myStr) {
var self = this; // Line added
this.myStr = myStr;
this.contains = function(fragment) {
return self.myStr.indexOf(fragment) !== -1; // this changed to self
};
}
我想知道:
function Foo(myStr) {
this.myStr = myStr;
this.contains = function(fragment) {
return this.myStr.indexOf(fragment) !== -1;
};
}
var someFoo = new Foo('foobar');
['foo', 'bar'].every(someFoo.contains)
TypeError: Cannot call method 'indexOf' of undefined
我能做到這一點,使其工作擴展String.prototype
,這樣我就不必將'someString'.contains
綁定到'someString'
每次我將它用作函數而不調用它。
你應該* *這樣做會讓你感到尷尬的方式?強硬。 – Jon
@Jon因爲我可以像在我創建的Foo類中那樣做。我使用FP很多,如果我沒有得到與String相關的'contains'函數,我覺得我的程序會犯很多錯誤,因爲這樣的用法遍佈我的程序... – octref
字符串沒有辦法,我懷疑它爲MyString類型會很有用。 – Tibos