簡體   English   中英

Javascript-defineProperty與原型

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM