Javascript.RU

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

Кроме огорода замыканий не вижу вариантов. Можно, например, создавать в конструкторе одноимённое прототипному свойство, которое будет вызывать функцию с тем же именем. из прототипа, передавая ей приватную переменную. Саму процедуру обёртывания и замыкания можно тоже в прототип переместить. Так в конструкторе повторы будут, конечно, но меньше, чем если просто там размещать все функции. Получается как-то так:
function Human(name) {
	this.makeWrap("getName", [name]);
}

Human.prototype = {
	makeWrap:  function (propertyName, args) {
		this[propertyName] = (
			function(args) {
				return function() {
					return Human.prototype[propertyName](args);
				}
			}
		)(args)
	},
	getName: function(name) {
		return name[0];
	},
	constructor: Human
}
 
h1 = new Human("Василий Иванович");
h2 = new Human("Иван Васильевич");

alert(h1.getName())
alert(h2.getName())
. Как-то костыльно, nein? Вариант с соглашением проще. и лучше, на мой взгляд.

Последний раз редактировалось GuardCat, 12.04.2012 в 23:47.
Ответить с цитированием
  #12 (permalink)  
Старый 13.04.2012, 00:02
Интересующийся
Отправить личное сообщение для Mixxx Посмотреть профиль Найти все сообщения от Mixxx
 
Регистрация: 11.04.2012
Сообщений: 20

Сообщение от GuardCat Посмотреть сообщение
Вариант с соглашением проще. и лучше, на мой взгляд.
Конечно проще, я его и юзаю всегда. Только если человек спросил как сделать как бы "приватную" переменную зачем его отговаривать? Он же не просто так спросил. Значит ему так надо. Коллеги, давайте уже наконец доверять друг другу

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

Сообщение от Mixxx Посмотреть сообщение
Исправил вашь код:
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
Это конечно решение, но я так понимаю смысл использование прототипов теряется? Потому как: Alfa.__proto__ !== Beta.__proto__ Ну то-бишь не реюзится отсылка к прототипу уже, а попросту новые прототипы?

В таком случае решение с символом «_» — лучший вариант, когда нужны тру-прототипы.

Последний раз редактировалось unclechu, 13.04.2012 в 00:44.
Ответить с цитированием
  #14 (permalink)  
Старый 13.04.2012, 01:23
Интересующийся
Отправить личное сообщение для Mixxx Посмотреть профиль Найти все сообщения от Mixxx
 
Регистрация: 11.04.2012
Сообщений: 20

GuardCat,
Посмотрел вашь код
понял что вы предлагаете запоминать name в массиве который зависнет как параметр анонимной функции внутри нового метода getName который переопределит makeWrap. Надо сказать это весьма и весьма хиро%опо
setName можно реализовать также как в конструкторе:
...
	setName: function(newName)
	{
		this.makeWrap('getName',[newName])
	},
...

Но ведь это ужасно получается прямого доступа к полю нейм нету даже внутри методов объекта.

Во что у меня получилось из вашего кода (массивы убрал так как тут они не нужны):
function log(a){alert(a)}

function Human(name) 
{
	this.makeWrap("getName", name);
}

Human.prototype = 
{
	makeWrap:  function (propertyName, args) 
	{
		
		this[propertyName] = 
		(
			function(args) 
			{
				return function() 
				{
					return Human.prototype[propertyName](args);
				}
			}
		)(args)

	},
	setName: function(newName)
	{
		this.makeWrap('getName',newName)
	},
	getName: function(name) 
	{
		return name;
	},
	setLastName: function(LName)
	{
		this.makeWrap('getLastName',LName)
	},
	getLastName: function(LName)
	{
		return LName
	},
	getFullName: function()
	{
		return this.getName()+' '+this.getLastName();
	}

//	,constructor: Human
}
 
h1 = new Human("Владимир");
h2 = new Human("Дмитрий");
h1.setLastName('Путин');
log(h1.getFullName())

h2.setLastName('Медведев');
log(h2.getFullName())

h2.setName('Александр')
log(h2.getFullName())

log('Протипы равны? '+(h1.__proto__ === h2.__proto__))

Последний раз редактировалось Mixxx, 13.04.2012 в 01:55.
Ответить с цитированием
  #15 (permalink)  
Старый 13.04.2012, 07:07
Аватар для GuardCat
Просто любитель
Отправить личное сообщение для GuardCat Посмотреть профиль Найти все сообщения от GuardCat
 
Регистрация: 13.09.2011
Сообщений: 300

Mixxx, массивы будут удобны, если возникнет необходимость передавать больше одного параметра. Можно и в этом случае обойтись без массивов, но с ними проще.
Ответить с цитированием
  #16 (permalink)  
Старый 13.04.2012, 14:55
Аватар для unclechu
Интересующийся
Отправить личное сообщение для unclechu Посмотреть профиль Найти все сообщения от unclechu
 
Регистрация: 12.09.2011
Сообщений: 14

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

Приваты, судя по ECMA будут, и как я понял это будет private и объект x.
private key
x.key // x для приватов вместо this
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
передача переменной из функции в другую 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