回到课程
本资料仅提供以下语言版本:English, 日本語, Русский。请 帮助我们 将其翻译为 简体中文 版本。

给字典对象添加 toString 方法

重要程度: 5

有一个对象 dictionary,通过 Object.create(null) 创建,用来存储任意键值对。

为该对象添加方法 dictionary.toString(),返回所有键的列表,用逗号隔开。你的 toString 方法不能对该对象使用 for...in

以下是它的运行例子:

let dictionary = Object.create(null);

// 添加 dictionary.toString 方法的代码

// 添加一些数据
dictionary.apple = "Apple";
dictionary.__proto__ = "test"; // __proto__ 在这里是正常参数

// 只有 apple 和 __proto__ 在循环内
for(let key in dictionary) {
  alert(key); // "apple",然后 "__proto__"
}

// your toString in action
alert(dictionary); // "apple,__proto__"

可以使用 Object.keys 列出所有可枚举键值,然后输出。

为了使 toString 不可枚举,我们使用属性描述器来定义它。Object.create 语法允许我们为一个对象提供属性描述器作为第二参数。

let dictionary = Object.create(null, {
  toString: { // 定义 toString 方法
    value() { // value 是一个函数
      return Object.keys(this).join();
    }
  }
});

dictionary.apple = "Apple";
dictionary.__proto__ = "test";

// apple 和 __proto__ 在循环内
for(let key in dictionary) {
  alert(key); // "apple",然后 "__proto__"
}

// 通过 toString 得到逗号分隔的属性值
alert(dictionary); // "apple,__proto__"

当我们使用描述器创建一个属性,它的标识默认是 false。因此在以上代码中,dictonary.toString 是不可枚举的。