如何实现对象内部插槽属性

Posted

技术标签:

【中文标题】如何实现对象内部插槽属性【英文标题】:How to implement object internal slot property 【发布时间】:2019-01-24 01:27:24 【问题描述】:

我知道一些 Javascript 对象有一些内部插槽属性,用方括号 [[ ]] 包围,并且只能通过方法访问。

例如:

var str = new String('example');

检查变量 str 时,我看到属性 [[PrimitiveValue]] 具有 example 值,但我无法访问此属性,因为它是内部的。只能通过toString() 方法访问它。

我的问题是:我怎样才能实现具有这种行为的自定义对象?拥有一个带有 [[ ]] 的内部属性和一个访问该属性的方法.

【问题讨论】:

是JS引擎创建的吧? 一个内部类会有内部属性 先生我不知道它来自哪里。但是我们可以创建一个与这种行为完全相同的对象吗? 您不能实现自己的类并扩展具有[[PrimitiveValue]]String 吗? 我不想扩展任何可用的 Js 对象。我想创建一个新对象。例如,我使用 [[MyField]] 和 getMyField 方法创建 MyObject 来获取它的值。但不知道它是否允许这样做 【参考方案1】:

From this shim on Github:

var SLOT = require('internal-slot');
var assert = require('assert');

var o = ;

assert.throws(function ()  SLOT.assert(o, 'foo'); );

assert.equal(SLOT.has(o, 'foo'), false);
assert.equal(SLOT.get(o, 'foo'), undefined);

SLOT.set(o, 'foo', 42);

assert.equal(SLOT.has(o, 'foo'), true);
assert.equal(SLOT.get(o, 'foo'), 42);

assert.doesNotThrow(function ()  SLOT.assert(o, 'foo'); );

【讨论】:

以上是关于如何实现对象内部插槽属性的主要内容,如果未能解决你的问题,请参考以下文章

如何正确使用 vue js Web 组件内部的插槽并应用样式

vue2如何实现点击按钮,出现一个原对象中没有的属性

原型,原型链,以及如何实现继承

Swift中@dynamicMemberLookup和callAsFunction特性实现对象透明代理功能

Swift中@dynamicMemberLookup和callAsFunction特性实现对象透明代理功能

浅谈面向对象之封装继承多态!如何使用内部类模拟多继承