【问题标题】:Accesing method startsWith throw error when calling console.log() in proxy在代理中调用console.log()时访问方法startsWith抛出错误
【发布时间】: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


【解决方案1】:

在访问代理对象(如console.log does it in node.js)上的符号键属性时,陷阱处理程序将符号作为property 参数传递,而不是属性名称。符号当然没有 startsWith 字符串方法。使用

if (typeof property == "string" && property.startsWith("_")) {

改为。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-02-26
    • 2017-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-02
    • 1970-01-01
    相关资源
    最近更新 更多