【发布时间】:2019-09-09 20:38:33
【问题描述】:
我正在学习 ES6 代理,为此我遵循javascript.info 上的指南,以下示例,如果属性名称以下划线开头,请避免读取、删除、添加新属性和列出属性,例如 @ 987654322@
let user = {
username: "john.doe",
firstname: "John",
lastname: "doe",
email: "john.doe@example.com",
_password: "******"
};
user = new Proxy(user, {
get(target, property) {
if (property.startsWith("_")) {
throw new Error("Access denied");
}
return target[property];
},
set(target, property, value) {
if (value.startsWith("_")) {
throw new Error("Access denied");
}
target[property] = value;
return true;
},
deleteProperty(target, property) {
if (property.startsWith("_")) {
throw new Error("Access denied");
}
delete target[property];
return true;
},
ownKeys(target) {
return Object.keys(target).filter(key => !key.startsWith("_"));
}
});
const { username, firstname, lastname, email } = user;
console.log(username, firstname, lastname, email);
console.log(JSON.stringify(user, null, 2));
console.log(user);
对console.log(JSON.stringify(user, null, 2)); 的调用显示了预期的输出,因为输出中省略了_password
{
"username": "john.doe",
"firstname": "John",
"lastname": "doe",
"email": "john.doe@example.com"
}
但是当调用console.log(user); 时出现以下错误
/tmp/index.js:48
if (property.startsWith("_")) {
^
TypeError: property.startsWith is not a function
感谢您的 cmets
【问题讨论】:
-
我运行了你的确切代码,没有任何错误(Chrome 76)
-
我正在尝试使用 Firefox 69
-
如果没有给定属性,只返回顶部的目标怎么办?
if (!property) { return target; } -
在 Firefox 69 中测试,没有问题。 Edge 有点工作(奇怪的行为),但也不会抛出任何错误。
-
对不起,伙计们,我没有提供完整的信息,最后一次测试我用节点调用脚本我已经验证在 Firefox 中它按预期运行安装的节点版本是 v10 .16.3
标签: javascript node.js ecmascript-6 proxy