因此,我構建了一些可執行簡單類型檢查的可鏈接函數。目前,我打電話給我的功能是這樣的:API:在JavaScript中構造不帶括號的可鏈接函數
Proceed().if('someString').is.a('string');
但我真正想要是我的API看起來像這樣:
proceed.if('someString').is.a('string');
注意,第二個代碼示例中,第一個函數調用中缺少開始和結束括號。
正如你可以從下面的代碼中看到的,我已經想通了如何讓is
和a
工作,但我似乎無法找到一種方法,以消除來自Proceed()
功能括號。
下面是代碼示例,工程:
function Proceed() {
if (!(this instanceof Proceed)) {
return new Proceed();
}
this.target = "";
}
Proceed.prototype.if = function (target) {
this.target = target;
return this;
}
Proceed.prototype.a = function (type) {
console.log(this.target + ' === ' +type, typeof this.target === type);
};
Object.defineProperty(Proceed.prototype, 'is', {
get: function() {
return this;
}
});
Proceed().if('someString').is.a('string'); // true
Proceed().if('someString').is.a('function'); // false
// Everything Above this line Works!
而現在,我試圖從Proceed()
刪除括號看起來是這樣的:
Object.defineProperty(Proceed.prototype, 'proceed', {
set: function(){},
get: function(){
return Proceed(this);
},
configurable: true
});
proceed.if('someString').is.a('string'); // ReferenceError
proceed.if('someString').is.a('function'); // ReferenceError
我從這裏得到的錯誤是這個:
Uncaught ReferenceError: proceed is not defined
如果我用Object.prototype
替換Proceed.prototype
然後我可以使它工作,但這意味着我已經擴展了一個本地對象,這可能是有問題的。
因此,有誰知道一種方法,我可以把它關閉而不危險地擴展本地對象?我在這裏做錯了什麼?
Here is a jsFiddle with the above code samples。
任何幫助表示讚賞。
UPDATE#1此代碼被設計爲節點模塊,因此不會有任何訪問瀏覽器的window
對象。
不要以爲你可以不擴展對象或窗口。我用窗口而不是繼續測試:https://jsfiddle.net/Lw29zyf1/4/ –