Обращение к приватной переменной из прототипной функции
Доброго времени суток! Подскажите, никак не могу найти решение касательно 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 многого ли стоит? |
Цитата:
Цитата:
var human = (function () { var prototype = {} prototype.getName +function(){ var name; prototype.getName = function (str) { if (str) name = str return name } function constructor(data) { name } }() constructor.prototype = prototype return constructor }()) var h1 = new human h1.getName('Vasia') var h2 = new human h2.getName('Petia') |
Цитата:
Если бы всё было так просто, я бы не спрашивал, после выполнения этого кода, стало так: h1.getName() // Petia h2.getName() // Petia Мне нужно чтобы name был уникальным для каждого экземпляра. |
Цитата:
Цитата:
var human = (function () { var prototype = {} prototype.getName +function(){ var name; prototype.getName = function (str) { if (str) name = str return name } function constructor(data) { name } }() constructor.prototype = prototype return constructor }()) var h1 = new human h1.getName('Vasia') var h2 = new human h2.getName('Petia') |
Исправил вашь код:
function log(a){document.body.innerHTML+=a+'<br>'} //функция хуман это не конструктор, она возвращает конструктор которы надо потом инициализировать с помощью new var human = (function () { var prototype = {} //prototype.getName var _data, _name; prototype.setName = function (str) { if (str) _name = str } prototype.getName = function () { return _name } function constructor(data) { //this.name _data=data } constructor.prototype = prototype return constructor }) var Alfa = new (human())() //столько скобок нужно что бы new относилось к constructor а не к human, Alfa.setName('Vasia') log('Alfa: '+ Alfa.getName() ) var Beta = new (human())() Beta.setName('Petia') Beta._name='Евгений Ваганыч'; //создаться публичное свойство _name но приватное _name не изменится log('Beta: '+ Beta.getName() ); log('Alfa: '+ Alfa.getName() ) Раед, Вашь код не работает в IE9 и Опере (в других не тестил) опера ругается Uncaught exception: TypeError: 'h1.getName' is not a function И я не понимаю что за синтаксис такой +function |
Цитата:
var human = (function () { var prototype = {} prototype.getName +function(){ var name; prototype.getName = function (str) { if (str) name = str return name } function constructor(data) { name } }() constructor.prototype = prototype return constructor }()) var h1 = new (human())(); h1.getName('Vasia') var h2 = new (human())(); h2.getName('Petia') Цитата:
|
Просто назовите свойство
_name . Такое соглашение о именование свойств, которые не должны использоваться снаружи, давно устоялось, известно и используется множеством js-программистов. |
Цитата:
Цитата:
Опера например ругается Цитата:
Цитата:
|
Цитата:
|
Ну городите замыкания, раз вас веселит соглашение об именовании свойств, которое, как UpperCamelCase для конструкторов и lowerCamelCase для всего остального, присутствует в guidеline\'ах к стилю JavaScript-кода.
|
Часовой пояс GMT +3, время: 18:26. |