Модераторы: Sardar, Aliance
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Обращение к приватной переменной из прототипа 
:(
    Опции темы
InfMag
Дата 12.4.2012, 18:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



***


Профиль
Группа: Завсегдатай
Сообщений: 1037
Регистрация: 21.11.2004

Репутация: 2
Всего: 4



Доброго времени суток! Подскажите, никак не могу найти решение касательно 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 многого ли стоит?
PM   Вверх
Aliance
Дата 13.4.2012, 10:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I ♥ <script>
****


Профиль
Группа: Модератор
Сообщений: 6418
Регистрация: 2.8.2004
Где: spb

Репутация: 55
Всего: 137



Код

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 );

PM MAIL WWW ICQ Skype   Вверх
InfMag
Дата 13.4.2012, 14:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



***


Профиль
Группа: Завсегдатай
Сообщений: 1037
Регистрация: 21.11.2004

Репутация: 2
Всего: 4



Aliance, смысл потерялся в данном случае, тут никакой прототипности, для каждого нового объекта — новые методы в памяти.
http://javascript.ru/forum/misc/27432-obra...-funkcii-2.html
Вот тут вопрос свёлся к тому, что проще всего использовать приставочку _ к именам свойств, пока ещё не ввели приваты в JS.
ECMA уже описали применение приватов: http://wiki.ecmascript.org/doku.php?id=str...n:private_names
PM   Вверх
ksnk
Дата 13.4.2012, 15:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 84
Всего: 386



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

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

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

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


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
InfMag
Дата 14.4.2012, 06:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



***


Профиль
Группа: Завсегдатай
Сообщений: 1037
Регистрация: 21.11.2004

Репутация: 2
Всего: 4



ksnk, ну да, кому интересен живой пример с геттерами-сеттерами в конструкторе: http://forum.nodejs.ru/index.php/topic,1575.0.html
Но по результатом тестов геттеры и сеттеры — жутко медленная штука, и если нужна производительность — решение не лучшее.
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Форум для вопросов, которые имеются в справочниках, но их поиск вызвал затруднения, или для разработчика требуется совет или просьба отыскать ошибку. Напоминаем: 1) чётко формулируйте вопрос, 2) приведите пример того, что уже сделано, 3) укажите явно, нужен работающий пример или подсказка о том, где найти информацию.
 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | JavaScript: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1013 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.