[英]Javascript - defineProperty vs Prototype
我在嘗試為模擬.net(linq)中稱為SingleOrDefault()的函數的函數創建數組原型時遇到了一個意外問題。
雖然原型函數運行良好,但我發現,使用以下語法對(var x in y)的以下語法進行迭代時,我的函數名稱顯示為屬性之一,破壞了我的邏輯。
由於進行了一些谷歌搜索,我重新定義了該函數(如下)。
我的問題是, Current塊中的代碼是擴展Array對象而不引起任何不良副作用的正確方法嗎?
以前
Array.prototype.singleOrDefault = function (predicate) {
var items = applyPredicate(this, predicate);
if (items.length > 1) {
throw new Error(errorOutput.multipleElements);
}
return (items) ? items[0] : null;
};
當前
Object.defineProperty(Array.prototype, 'singleOrDefault', {
value: function (predicate) {
var items = applyPredicate(this, predicate);
if (items.length > 1) {
throw new Error(errorOutput.multipleElements);
}
return (items) ? items[0] : null;
},
enumerable: false
});
是的,您的“當前”代碼是正確的,較舊的瀏覽器不像以前的代碼那樣受支持,如果您需要ie6 / 7支持,那么這是一個缺點(請參閱https://developer.mozilla.org/en-US/docs/Web/ JavaScript / Reference / Global_Objects / Object / defineProperty )。
您可以將object.hasOwnProperty方法與“先前”代碼一起使用,以在迭代時實現相同的效果:
for (var x in y) {
if (y.hasOwnProperty(y[x])) {
//would filter out SingleOrDefault in your examples above
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.