如何实现对象内部插槽属性
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 组件内部的插槽并应用样式
Swift中@dynamicMemberLookup和callAsFunction特性实现对象透明代理功能