Страницы

Поиск по вопросам

понедельник, 1 апреля 2019 г.

Приватные свойства в js

Я не знаю как правильно сказать, но как сделать свойство, которое было бы не видно внешне, но было бы видно методам установленных через прототип? Вот типа - var Class = function(){ var _array = []; // приватное или протектед свойство };
Class.prototype.method = function(){ // как обратиться здесь к _array? }; Возможно такое сделать из коробки?


Ответ

Средства языка такого, насколько я знаю, не предоставляют. Поэтому javascript-еры договорились, что все свойства которые начинаются со знака нижнего подчеркивания '_' являются приватными. В вашем случае: var Class = function(){ this._array = []; // приватное или протектед свойство };
Class.prototype.method = function(){ // как обратиться здесь к _array? this._array
};
var instance = new Class();
instance._array.push('string') // но мы то знаем, что так делать нельзя Update Появилась идея. Шифровать имя свойства и делать его enumerable. Костыль: var prive = function (that, propName, newValue) { var decodeStr = function (str) { return Array.prototype.map.call( str, function (char, i) { return String.fromCharCode(str.charCodeAt(i)-5) }).join(''); }, decodedPropName = decodeStr(propName); if (arguments.length >= 3) { // set private property Object.defineProperty(that, decodedPropName, { enumerable: false, writable: true, value: newValue, }); } else { //get private property return that[decodedPropName]; } } Демонстрация

Комментариев нет:

Отправить комментарий