[英]Extending js prototype, argument is getting type coerced
我有一個像這樣的函數:
Object.prototype.search=function(str){
var o=this;
var keys=Object.keys(o);
var obj={};
str=str.toLowerCase();
var regEx=new RegExp(str,"ig");
... etc.
注意-這只是用於搜索某些數據的快速而骯臟的功能。 我確定可以更有效地實現我想要的東西,但是我只是想了解一些東西。
我創建了該函數的其余部分,並且在我第一次嘗試在控制台中時,碰巧給它傳遞了一個數字。 現在,該數字作為字符串傳遞,我希望它是一個字符串,當我在控制台中運行"555".toLowerCase()
時,沒問題,按預期返回字符串。 但是,當我嘗試執行該函數時,它將引發異常:
uncaught TypeError: str.toLowerCase is not a function
at Number.Object.search
所以我可以看到它正在將我的字符串轉換為數字,但是我不明白為什么。 是因為我正在處理內置對象嗎? 錯誤在我嘗試str=str.toLowerCase()
的行上引發。 似乎解決方案是將其顯式聲明為字符串,但是我明白了為什么需要這樣做。
有任何想法嗎?
編輯:這是我的代碼-我知道這很麻煩,但是現在我遇到了其他問題,我很好奇,因為我不知道發生了什么事情:
Object.prototype.search=function(str){
const o=this;
var keys=Object.keys(o);
var values=Object.values(o);
var obj={};
var regex=new RegExp(str.toLowerCase(),"ig");
values=values.map((value,index)=>{
if(value){
value=value.toString();
return value.search(regex) !==-1 ? index : false;
}
return false;
}).filter(e=>!!e);
values.forEach((e,i)=>{
var key=keys[i];
var value=o[key];
obj[key]=value;
});
return obj;
};
編輯:這是在行動:
var x={"cat":"23","hat":"45"};
x.search("2");
Expected result: {"cat":"23"};
不:在包括了對值的空檢查之后,我不再得到錯誤,但是我也沒有得到我期望的結果。 換句話說,我得到了一個對象,並對其進行了過濾,但是根據給定的參數,它返回的是“錯誤”的值。
編輯:好的-現在已修復。 問題出在這一行: var key=keys[i];
。 我正在使用鍵的索引而不是值的索引。 所以現在是對的。 但是我仍然不明白為什么我會得到空檢查之前的錯誤。 如果人們認為我應該關閉該窗口,但是我仍然不明白為什么會出現錯誤。
功能的更清潔版本:
Object.defineProperty(Object.prototype, 'search', { value: function(regex) { let found = {}; for (let k in this) { if (this.hasOwnProperty(k) && regex.test(this[k].toString())) found[k] = this[k]; } return found; }, enumerable: false }); console.log(({ cat: 23, hat: 45 }).search(/2/)); console.log(({ cat: 23, hat: 45 }).search(/.*/));
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.