javascript - 如何创建具有自定义内部插槽的对象?

标签 javascript encapsulation private-members

我认识到某些 JavaScript 对象具有内部槽属性,在规范中用双方括号 [[ ]] 表示,只能通过方法访问。

例如:

var str = new String('example');

检查变量 str 时,我发现内部槽 [[PrimitiveValue]] 的值为 'example',但我无法直接访问,因为它是内部的。访问它的唯一方法是通过方法toString()

我的问题是:如何使用自定义内部属性和访问该属性的自定义方法来实现具有该行为的自定义对象?

最佳答案

[[PrimitiveValue]] 是一个内部属性,you can't interact with it from your code 。但是您可以通过重写 toPrimitive 方法来模拟 String 类的行为:

var str = { 
    [Symbol.toPrimitive]: (hint) =>  {
        return 'example';
    }
};

console.log(`${str}`); // 'example'

toPrimitive 方法在 EcmaScript 6.0, 7.1.1 中定义。 。它通过一个名为 hint 的参数调用,该参数可以是 'default''string''number' 。您可以根据提示返回不同的值,以使对象的行为类似于字符串和数字:

var str = { 
    [Symbol.toPrimitive]: (hint) =>  {
        if (hint === 'number') return 111;
        return 'example';
    }
};

console.log(`${str}`); // 'example'
console.log(str * 10); // 1110

关于javascript - 如何创建具有自定义内部插槽的对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51888007/

相关文章:

java - 访问子类对象自己的私有(private)字段

c++ - 私有(private)成员(member)和免费功能的 Doxygen 评论?

Java数据封装、初始化和后置条件?

C++阅读器函数设计: helper functions,类,私有(private),过度工程?

javascript - 无法使用jquery从外部url获取json

返回按计数排序的唯一值的 JavaScript 函数

java - 信息隐藏和封装有什么区别?

java - 将实例变量设为私有(private)只会对子类有利吗?

javascript - 两个foreach替换JS

javascript - 使用 eclipse 在 angularjs 中运行 Linux/windows 命令