Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > JavaScript: Общие вопросы > Обращение к приватной переменной из прототипа


Автор: InfMag 12.4.2012, 18:50
Доброго времени суток! Подскажите, никак не могу найти решение касательно js. Давайте сразу к простому примеру:
Код
var human = (function () {
    var prototype = {}
    prototype.getName

    prototype.getName = function (str) {
        if (str) this.name = str
        return this.name
    }

    function constructor(data) {
        this.name
    }
    constructor.prototype = prototype
    return constructor
}())

var h1 = new human
h1.getName('Vasia')
var h2 = new human
h2.getName('Petia')

Условие тут таково, что должны быть прототипные функции, которые будут обращаться в приватным переменным экземпляра конструктора.
В данном случае this.name — это публичное свойство, но что если я не хочу чтобы можно было напрямую менять name в духе:
Код
var h1 = new human
h1.getName('Vasia')
h1.name = 'Petia'

Как мне это преградить? Иными словами: как работать с приватными переменными из функции в прототипе? Вроде как банальная потребность.
Единственное что пришло в голову: это хранить массив id экземпляров с объектами данных выше уровнем, чем конструктор, а в this.id хранить уже сам идентификатор конкретного экземпляра. Но, согласитесь, это маразм,  да и к тому же поменять id многого ли стоит?

Автор: Aliance 13.4.2012, 10:28
Код

function myClass(value) {
 
    var privateVariable;
 
    this.protectedVariable = value;
 
    this.publicGetter = function() {
        return privateVariable;
    }
 
    this.publicSetter = function(value) {
        privateVariable = value;
    }
}

var a = new myClass('test value');
a.publicSetter('private var value');
alert( a.publicGetter() );
alert( a.protectedVariable );

Автор: InfMag 13.4.2012, 14:30
Aliance, смысл потерялся в данном случае, тут никакой прототипности, для каждого нового объекта — новые методы в памяти.
http://javascript.ru/forum/misc/27432-obrashhenie-k-privatnojj-peremennojj-iz-prototipnojj-funkcii-2.html
Вот тут вопрос свёлся к тому, что проще всего использовать приставочку _ к именам свойств, пока ещё не ввели приваты в JS.
ECMA уже описали применение приватов: http://wiki.ecmascript.org/doku.php?id=strawman:private_names

Автор: ksnk 13.4.2012, 15:02
Цитата(InfMag @  12.4.2012,  18:50 Найти цитируемый пост)
getName

вероятно имелось ввиду setName?

InfMag, protected в Javascript организовать сложно... Я простого решения не вижу, а приватные и публичные свойства естественно и непринужденно получаются из функций и переменных, объявленных в конструкторе (приватные) и свойствами объекта this, определенными в конструкторе (публичные).

Добраться до приватных свойств иначе чем через специальные геттеры сеттеры нельзя не только в JS но и в любом другом языке.

Автор: InfMag 14.4.2012, 06:49
ksnk, ну да, кому интересен живой пример с геттерами-сеттерами в конструкторе: http://forum.nodejs.ru/index.php/topic,1575.0.html
Но по результатом тестов геттеры и сеттеры — жутко медленная штука, и если нужна производительность — решение не лучшее.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)