2016-11-06 187 views
1

我想使用ES6代理陷阱以下常見代碼:使用ES6代理陷阱Object.hasOwnProperty

for (let key in trapped) { 
    if (!Object.prototype.hasOwnProperty.call(obj, key)) continue; 
    let value = trapped[key]; 
    //various code 
} 

但審查後proxy documentation,我不知道如何做到這一點,主要是因爲has陷阱陷阱適用於in運營商,該運營商似乎沒有在上面的代碼中使用該運營商,也沒有針對hasOwnProperty運營的陷阱。

回答

6

您可以使用getOwnPropertyDescriptor handler來捕獲hasOwnProperty()調用。

實施例:

const p = new Proxy({}, { 
 
    getOwnPropertyDescriptor(target, property) { 
 
    if (property === 'a') { 
 
     return {configurable: true, enumerable: true}; 
 
    } 
 
    } 
 
}); 
 

 
const hasOwn = Object.prototype.hasOwnProperty; 
 

 
console.log(hasOwn.call(p, 'a')); 
 
console.log(hasOwn.call(p, 'b'));

指定行爲,而不是一個特定實現的怪癖:

1

我其實要回答我的問題我自己,但我是太慢了,別人先回答了這個問題(和另外又添非常有用的信息)。不過,這裏是我想寫的答案,以防它可能會幫助別人以某種方式:


看來,當hasOwnProperty被稱爲getOwnPropertyDescriptor陷阱被觸發。所以,你可以捕獲hasOwnProperty通過執行以下操作:

getOwnPropertyDescriptor(target, name) { 
    return { 
     value : target[name], 
     //use a logical set of descriptors: 
     enumerable : true, 
     configurable : true, 
     writable : true 
    }; 
} 

另一部分是捕捉getownKeys還有:

get(target, name) { 
    return {}; //replace this with a relevant object 
} 

//These will be iterated over as part of the for loop 
ownKeys() { 
    return ["RelevantProperty1", "RelevantProperty2"]; 
} 

所有的一切,因爲你必須返回屬性,當你的數組陷阱ownKeys,在這個用例中,使用代理似乎並沒有讓事情變得更好。我認爲對於大多數情況下,以下將同樣適用,並且不易碎:

let obj = {}; 
let keys = ["a" , "b"]; 
for (let key of keys) { 
    obj[key] = {}; //relevant object 
} 

因此使用代理可能會矯枉過正。

+1

在發佈問題前準備答案通常會更好,因此您可以一次性發布答案。節省這些情況發生。儘管如此,仍然有用。 – vlaz

+0

@vlaz這是一個很好的觀點。我會在將來記住它。不過,我很高興Gothdo和其他人詳細闡述了這個機制的運作方式。 – GregRos