Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 19.07.2009, 14:57
Vladimir[gs]
 
Сообщений: n/a

Цепочки вызовов
Подскажите, как создаются такие штуковины? Хочу понять принцип.
F(10).plus(5).minus(3); // => 12
Ответить с цитированием
  #2 (permalink)  
Старый 19.07.2009, 15:02
Аватар для Riim
Рассеянный профессор
Отправить личное сообщение для Riim Посмотреть профиль Найти все сообщения от Riim
 
Регистрация: 06.04.2009
Сообщений: 2,379

Каждый метод должен возвращать объект с другими методами.

var MyObj = {
	myMethod1: function() {
		alert('1');
		return this;
	},
	myMethod2: function() {
		alert('2');
		return MyObj;
	}
};

MyObj.myMethod1().myMethod2().myMethod1().myMethod2();
Ответить с цитированием
  #3 (permalink)  
Старый 19.07.2009, 15:22
Vladimir[gs]
 
Сообщений: n/a

Спасибо за ответ. Как в этом случае передать данные первому объекту?
Ответить с цитированием
  #4 (permalink)  
Старый 19.07.2009, 16:02
Аватар для Riim
Рассеянный профессор
Отправить личное сообщение для Riim Посмотреть профиль Найти все сообщения от Riim
 
Регистрация: 06.04.2009
Сообщений: 2,379

Сообщение от Vladimir[gs
]Как в этом случае передать данные первому объекту?
Может не объекту, а функции?
Ответить с цитированием
  #5 (permalink)  
Старый 19.07.2009, 16:33
Vladimir[gs]
 
Сообщений: n/a

Да, наверное. Взгляните на пример из первого поста. Пока понятно только с методами (.plus(5).minus(3)).
Ответить с цитированием
  #6 (permalink)  
Старый 19.07.2009, 16:50
Аватар для Riim
Рассеянный профессор
Отправить личное сообщение для Riim Посмотреть профиль Найти все сообщения от Riim
 
Регистрация: 06.04.2009
Сообщений: 2,379

Сообщение от Vladimir
Взгляните на пример из первого поста.
Простейший вариант будет примерно таким:
var F = function(x) {
	return {
		plus: function(y) {
			x += y;
			return this;
		},
		minus: function(y) {
			x -= y;
			return this;
		},
		getResult: function() {
			return x;
		}
	};
};

alert(
F(10).plus(5).minus(3).getResult()
);


Он плох тем, что при каждом вызове F создается новый объект, тем самым забивается память браузера.

Вариант получше:
var F = function(x) {
	return new F._f(x);
};

F._f = function(x) {
	this.x = x;
};
F._f.prototype.plus = function(y) {
	this.x += y;
	return this;
};
F._f.prototype.minus = function(y) {
	this.x -= y;
	return this;
};
F._f.prototype.getResult = function(y) {
	return this.x;
};


alert(
F(10).plus(5).minus(3).getResult()
);
Ответить с цитированием
  #7 (permalink)  
Старый 19.07.2009, 17:35
Vladimir[gs]
 
Сообщений: n/a

Спасибо, понятно. Однако в цепочке появился метод getResult. Существует ли способы вернуть результат автоматически, без появления отдельных методов в цепочке?
Ответить с цитированием
  #8 (permalink)  
Старый 19.07.2009, 17:47
Аватар для Riim
Рассеянный профессор
Отправить личное сообщение для Riim Посмотреть профиль Найти все сообщения от Riim
 
Регистрация: 06.04.2009
Сообщений: 2,379

Сообщение от Vladimir[gs
]Существует ли способы вернуть результат автоматически, без появления отдельных методов в цепочке?
Можно добавлять методы в prototype числа (только F здесь уже не нужен):
Number.prototype.plus = function(num) {
	return this + num;
};
Number.prototype.minus = function(num) {
	return this - num;
};

alert(
(10).plus(5).minus(3)
);


Для удобного наполнения объектов свойствами/методами обычно используют функцию Object.extend . Простейший вариант:
Object.extend = function(self, obj) {
	for (var key in obj) self[key] = obj[key];
	return self;
};


И наполняем:
Object.extend(Number.prototype, {
	plus: function(num) {
		return this + num;
	},
	minus: function(num) {
		return this - num;
	}
});


upd: не очень удачно получилось, здесь методов мало, при большом количестве методов с Object.extend все же удобней.

Последний раз редактировалось Riim, 19.07.2009 в 17:53.
Ответить с цитированием
  #9 (permalink)  
Старый 19.07.2009, 18:08
Отправить личное сообщение для Octane Посмотреть профиль Найти все сообщения от Octane  
Регистрация: 10.07.2008
Сообщений: 3,873

Есть еще такой вариант:

function F(x) {
	x = new Number(x);
	x.plus = function(y) {
		return F(x + y);
	};
	x.minus = function(y) {
		return F(x - y)
	};
	return x;
}

alert(F(10).plus(5).minus(3));
Ответить с цитированием
  #10 (permalink)  
Старый 19.07.2009, 18:31
Vladimir[gs]
 
Сообщений: n/a

Спасибо, все ясно. Ушел экспериментировать.
Ответить с цитированием
Ответ



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

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