2016-11-06 9 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

Я был на самом деле собирался ответить на мой вопрос сам, но я был слишком медленным, и другие ответили на него первым (и к тому же добавили очень полезную информацию). Тем не менее, вот ответ, который я хотел написать, в случае, если это может помочь кому-то как-то:


Оказывается, что getOwnPropertyDescriptor ловушка срабатывает, когда hasOwnProperty называется. Таким образом, вы можете поймать hasOwnProperty, выполнив следующие действия:

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

Другая часть захвата get и ownKeys, а также:

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 это хороший момент. Я запомню это в будущем. Тем не менее, я рад, что Готдо и другие подробно остановились на том, как работает механизм. – GregRos

 Смежные вопросы

  • Нет связанных вопросов^_^