Как реализовать свойство внутреннего слота объекта
Я признаю, что некоторые объекты Javascript имеют некоторое внутреннее свойство слота, окруженное двойной квадратной скобкой [[]], и доступ к ним возможен только методом.
Например:
var str = new String('example');
При проверке переменной str
Я вижу, что свойство [[PrimitiveValue]] имеет значение в качестве примера, но я не могу получить доступ к этому свойству, потому что оно внутреннее. Единственный способ получить к нему доступ методом toString()
только.
Мой вопрос: как я могу реализовать пользовательский объект с таким поведением? Имея внутреннее свойство с окружением [[]] и метод доступа к этому свойству.
3 ответа
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'); });
Я не думаю, что вы можете создавать настоящие внутренние свойства/слоты .
С сайта 262.ecma-international.org:
Фактическая семантика объектов в ECMAScript определяется с помощью алгоритмов, называемых внутренними методами. Каждый объект в движке ECMAScript связан с набором внутренних методов, которые определяют его поведение во время выполнения. Эти внутренние методы не являются частью языка ECMAScript. Они определены в этой спецификации исключительно для пояснительных целей (выделено автором KooiInc).
Однако вы можете создавать объекты с внутренними значениями , доступными с помощью определяемых вами методов, используя фабричные функции . Например:
Вы можете создать собственный объект в JavaScript с закрытым свойством и методом доступа к нему, имитирующим поведение внутренних слотов. Например:
function CustomObject(value) {
const primitiveValue = value;
this.getValue = function () {
return primitiveValue;
};
}
const obj = new CustomObject('example');
console.log(obj.getValue());
Вот ссылка на документацию по этой теме: