2016-10-01 7 views
2

Что он хочет от меня? Как заставить его работать?TypeError: «ownKeys» на прокси: результат ловушки не включал «аргументы»

var proxy_handler = 
{ 
    ownKeys: function(target) 
    { 
     return Object.keys(target.data) 
    }, 
} 

var proxxxy = function(initial_data) 
{ 
    var return_value = "Goodbye world" 
    var target = function() { return return_value } 
    if(typeof initial_data == "undefined") 
    { 
     target.data = {} 
    } 
    else 
    { 
     target.data = initial_data 
    } 
    return new Proxy(target, proxy_handler) 
} 

var p = proxxxy({q:"aaa",w:"bbb",f:"ccc"}) 
console.log(p()) 
console.log(Object.getOwnPropertyNames(p)) 

Он печатает ошибку, но это не должно:

[email protected]:~/tst$ node --version 
v6.2.2 
[email protected]:~/tst$ node test3.js 
Goodbye world 
/home/me/tst/test3.js:26 
    console.log(Object.getOwnPropertyNames(p)) 
        ^

TypeError: 'ownKeys' on proxy: trap result did not include 'arguments' 
    at Object.<anonymous> (/home/me/tst/test3.js:26:24) 
    at Module._compile (module.js:541:32) 
    at Object.Module._extensions..js (module.js:550:10) 
    at Module.load (module.js:458:32) 
    at tryModuleLoad (module.js:417:12) 
    at Function.Module._load (module.js:409:3) 
    at Module.runMain (module.js:575:10) 
    at run (node.js:348:7) 
    at startup (node.js:140:9) 
    at node.js:463:3 

Является ли это ошибка? Если да, то где я могу это представить?

+1

Я считаю, что вы нарушаете инвариант - каждая функция должна имеют свойство '.arguments', но у вас нет. Почему это происходит при вызове 'getOwnPropertyNames'? Я не знаю. – Bergi

ответ

2

Это не ошибка; это поведение определяется proxy spec для этапа ownKeys, этап 17a. На простом английском языке, любое не конфигурируемое свойство фактического target должен произойти в списке свойств, возвращаемых ownKeys, поэтому специально arguments отсутствует в вашем примере:

> Object.getOwnPropertyDescriptor(target, "arguments") 
Object {value: null, writable: false, enumerable: false, configurable: false} 
+0

Так что я не могу создать прокси-функцию функции с настраиваемыми свойствами с именами 'arguments',' caller' и 'prototype', потому что эти имена жестко закодированы как неконфигурируемые. Это верно? – user619271

+1

Да, и вы не можете опустить их в списке результатов прокси-ловушки. – jmrk