Как реализовать свойство внутреннего слота объекта

Я признаю, что некоторые объекты Javascript имеют некоторое внутреннее свойство слота, окруженное двойной квадратной скобкой [[]], и доступ к ним возможен только методом.

Например:

var str = new String('example');

При проверке переменной strЯ вижу, что свойство [[PrimitiveValue]] имеет значение в качестве примера, но я не могу получить доступ к этому свойству, потому что оно внутреннее. Единственный способ получить к нему доступ методом toString() только.

Мой вопрос: как я могу реализовать пользовательский объект с таким поведением? Имея внутреннее свойство с окружением [[]] и метод доступа к этому свойству.

3 ответа

Из этой прокладки на 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'); });

Я не думаю, что вы можете создавать настоящие внутренние свойства/слоты .

С сайта 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()); 

Вот ссылка на документацию по этой теме:

Частные переменные в JavaScript

Другие вопросы по тегам