Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 12.04.2012, 19:44
Аватар для unclechu
Интересующийся
Отправить личное сообщение для unclechu Посмотреть профиль Найти все сообщения от unclechu
 
Регистрация: 12.09.2011
Сообщений: 14

Обращение к приватной переменной из прототипной функции
Доброго времени суток! Подскажите, никак не могу найти решение касательно 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 многого ли стоит?
Ответить с цитированием
  #2 (permalink)  
Старый 12.04.2012, 20:10
Аватар для Раед
''
Отправить личное сообщение для Раед Посмотреть профиль Найти все сообщения от Раед
 
Регистрация: 11.12.2011
Сообщений: 636

Сообщение от unclechu
как работать с приватными переменными из функции в прототипе
Сообщение от nasqad
надо новое замыкание создавать
может так
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')

Последний раз редактировалось Раед, 12.04.2012 в 20:26.
Ответить с цитированием
  #3 (permalink)  
Старый 12.04.2012, 20:14
Аватар для unclechu
Интересующийся
Отправить личное сообщение для unclechu Посмотреть профиль Найти все сообщения от unclechu
 
Регистрация: 12.09.2011
Сообщений: 14

Сообщение от Раед Посмотреть сообщение
как обычно, через замыкание
var human = (function () {
    var name;
    var prototype = {}
    prototype.getName
 
    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 был уникальным для каждого экземпляра.
Ответить с цитированием
  #4 (permalink)  
Старый 12.04.2012, 20:26
Аватар для Раед
''
Отправить личное сообщение для Раед Посмотреть профиль Найти все сообщения от Раед
 
Регистрация: 11.12.2011
Сообщений: 636

Сообщение от unclechu
как работать с приватными переменными из функции в прототипе
Сообщение от nasqad
надо новое замыкание создавать
может так
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')
Ответить с цитированием
  #5 (permalink)  
Старый 12.04.2012, 20:32
Интересующийся
Отправить личное сообщение для Mixxx Посмотреть профиль Найти все сообщения от Mixxx
 
Регистрация: 11.04.2012
Сообщений: 20

Исправил вашь код:
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

Последний раз редактировалось Mixxx, 12.04.2012 в 21:03.
Ответить с цитированием
  #6 (permalink)  
Старый 12.04.2012, 21:14
Аватар для Раед
''
Отправить личное сообщение для Раед Посмотреть профиль Найти все сообщения от Раед
 
Регистрация: 11.12.2011
Сообщений: 636

Сообщение от Mixxx
Вашь код не работает в IE9 и Опере
ну это понятно. так должен заработать
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')

Сообщение от Mixxx
что за синтаксис такой +function
а Это для вызова на месте. вместо скобок.

Последний раз редактировалось Раед, 12.04.2012 в 21:16.
Ответить с цитированием
  #7 (permalink)  
Старый 12.04.2012, 21:26
Отправить личное сообщение для Octane Посмотреть профиль Найти все сообщения от Octane  
Регистрация: 10.07.2008
Сообщений: 3,873

Просто назовите свойство _name. Такое соглашение о именование свойств, которые не должны использоваться снаружи, давно устоялось, известно и используется множеством js-программистов.
Ответить с цитированием
  #8 (permalink)  
Старый 12.04.2012, 21:47
Интересующийся
Отправить личное сообщение для Mixxx Посмотреть профиль Найти все сообщения от Mixxx
 
Регистрация: 11.04.2012
Сообщений: 20

Цитата:
а Это для вызова на месте. вместо скобок.
Не знал что так можно
Сообщение от Раед
ну это понятно. так должен заработать
Всеравно не работает ни в ие ни в опере
Опера например ругается
Цитата:
Uncaught exception: TypeError: 'human()' is not a constructor
Сообщение от Octane Посмотреть сообщение
Просто назовите свойство _name.
_name слишком скромно, лучше назвать $_$___$nAMe тогда точно никто его не изменит

Последний раз редактировалось Mixxx, 12.04.2012 в 21:51.
Ответить с цитированием
  #9 (permalink)  
Старый 12.04.2012, 22:54
Аватар для Раед
''
Отправить личное сообщение для Раед Посмотреть профиль Найти все сообщения от Раед
 
Регистрация: 11.12.2011
Сообщений: 636

Сообщение от Mixxx
лучше назвать $_$___$nAMe
не, лучше так: ['аопл уыркШГЦР ЦЫЕАП \n\n kdgnrjk \trnga 58456g563&*^*&^$%^$(']
Ответить с цитированием
  #10 (permalink)  
Старый 12.04.2012, 23:17
Отправить личное сообщение для Octane Посмотреть профиль Найти все сообщения от Octane  
Регистрация: 10.07.2008
Сообщений: 3,873

Ну городите замыкания, раз вас веселит соглашение об именовании свойств, которое, как UpperCamelCase для конструкторов и lowerCamelCase для всего остального, присутствует в guidеline'ах к стилю JavaScript-кода.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
передача переменной из функции в другую tkachka Общие вопросы Javascript 5 19.01.2012 17:01
изменение значения глобальной переменной внутри функции mgmarket Серверные языки и технологии 14 13.09.2011 00:56
изменение переменной в функции ananax Общие вопросы Javascript 19 12.01.2011 12:09
Обращение к глобальной переменной из jQuery Иван Алексеев jQuery 6 13.08.2010 20:56
Изменить значение переменной функции через select Fenec Элементы интерфейса 5 13.08.2010 15:32