Pull to refresh

Comments 10

Не безопасно и не изящно, но в любом случае пост полезен, спасибо!
Существует какой-нибудь способ реализации protected свойств?
Старые добрые замыкания?
protected — доступные в подклассах. С замыканиями такое не реализовать.
protected — доступные в подклассах. С замыканиями такое не реализовать.
Забыли написать, что заниматься отладкой кода с приватными членами сложнее. Или вы такой ерундой не занимаетесь? ;-)
И еще забыли померить скорость работы, если это важно, то подход с подчеркиваниями остается единственным выбором (подход с символом тоже должен быть быстрым). Еще справедливо было бы написать про геттеры/сеттеры (проблему приватности не решает, но скрывать данные помогает)
Классная идея с WeakMap + JS Class. Возьму себе на вооружение.
получается, что для каждого приватного свойства, создается отдельная WeakMap переменная и мне кажется это не практично, можно использовать следующий подход:

//private.js
'use strict';

export default function () {
    var map = new WeakMap();
    return (...args) => {
        if (args.length === 2) {
            return map.set(args[0], args[1]); //set private property
        } else if (args.length === 1) {
            return map.get(args[0]); //get private property
        } else if (args.length === 3 && args[2]) {
            return map.remove(args[0]);  //remove private property
        }
        throw new Error(`Private scope storage called with wrong count of arguments: ${arguments.length}`);
    };
};

использовать так:

//my-class.js
'use strict';

const $ = require('./private')(); 

export default class MyClass {
    constructor(options) {
        $(this, {
            name: options.name
        });
    }
    get name() {
        return $(this).name;
    }
}

или даже так:

//my-class.js
'use strict';

const $ = require('./private')();

export default class MyClass {
    constructor(options) {
        $(this, options || {});
    }
    get name() {
        return $(this).name;
    }
}
Sign up to leave a comment.