Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #11 (permalink)  
Старый 19.07.2009, 18:34
Аватар для Riim
Рассеянный профессор
Отправить личное сообщение для Riim Посмотреть профиль Найти все сообщения от Riim
 
Регистрация: 06.04.2009
Сообщений: 2,379

Сообщение от Octane
Есть еще такой вариант:
Функции будут создаваться при каждом вызове F.
Ответить с цитированием
  #12 (permalink)  
Старый 19.07.2009, 18:57
Отправить личное сообщение для Octane Посмотреть профиль Найти все сообщения от Octane  
Регистрация: 10.07.2008
Сообщений: 3,873

Сообщение от Riim
Функции будут создаваться при каждом вызове F.
Ну и что, вариант то имеет право на жизнь. Да и использование конструктора тоже затратный процесс, еще не известно, что быстрее выполнится в данном случае. Тем более сама рассматриваемая цепочка:
F(10).plus(5).minus(3)

носит чисто ознакомительный характер и врятли кто-то будет применять её в коде JavaScript-приложения.
Ответить с цитированием
  #13 (permalink)  
Старый 19.07.2009, 19:02
Аватар для Riim
Рассеянный профессор
Отправить личное сообщение для Riim Посмотреть профиль Найти все сообщения от Riim
 
Регистрация: 06.04.2009
Сообщений: 2,379

Сообщение от Riim
Функции будут создаваться при каждом вызове F
На самом деле это легко исправить .

Сообщение от Octane
вариант то имеет право на жизнь
Более того, в некоторых случаях это единственный вариант.
Ответить с цитированием
  #14 (permalink)  
Старый 19.07.2009, 19:19
Аватар для x-yuri
Отправить личное сообщение для x-yuri Посмотреть профиль Найти все сообщения от x-yuri
 
Регистрация: 27.12.2008
Сообщений: 4,201

Сообщение от Riim
var F = function(x) {
return {
plus: function(y) {
x += y;
return this;
},
minus: function(y) {
...
Он плох тем, что при каждом вызове F создается новый объект, тем самым забивается память браузера.
я бы сказал, объект создается в любом случае, а в этом варианте для каждого объекта создается отдельный "экземпляр" каждого метода
Ответить с цитированием
  #15 (permalink)  
Старый 19.07.2009, 19:24
Аватар для Riim
Рассеянный профессор
Отправить личное сообщение для Riim Посмотреть профиль Найти все сообщения от Riim
 
Регистрация: 06.04.2009
Сообщений: 2,379

Сообщение от x-yuri
я бы сказал, объект создается в любом случае, а в этом варианте для каждого объекта создается отдельный "экземпляр" каждого метода
Все верно, я там указал этот минус и ниже привел более правильный с этой точки зрения вариант.
Ответить с цитированием
  #16 (permalink)  
Старый 10.08.2009, 17:33
Аватар для leprosus
Новичок на форуме
Отправить личное сообщение для leprosus Посмотреть профиль Найти все сообщения от leprosus
 
Регистрация: 10.08.2009
Сообщений: 4

Вы не могли бы написать корректный код, который можно и нужно применять.
И желательно не на таком простом примере...

Давайте разберём вот такой пример:

dom("some_id").append("u").text("some text");

пускай код найдёт объект добавит тэг U и добавит текст.
Ответить с цитированием
  #17 (permalink)  
Старый 10.08.2009, 18:35
Отправить личное сообщение для Octane Посмотреть профиль Найти все сообщения от Octane  
Регистрация: 10.07.2008
Сообщений: 3,873

Да тут все просто
function F(node) {
   this.node = node;
}

F.prototype = {
   append: function(arg) { 
      return new F(this.node.appendChild(typeof arg == "string" ? document.createElement(arg) : arg));
   },
   text: function(str) {
      if(typeof str == "undefined") return this.node.innerText || this.node.textContent;
      this.node.innerHTML = "";
      this.node.appendChild(document.createTextNode(str));
      return this;
   }
};

function dom(arg) {
   return new F(typeof arg == "string" ? document.getElementById(arg) : arg);
}


Не могу не прорекламировать в этой теме Цепочки вызовов в JavaScript-фреймворке js-core

Последний раз редактировалось Octane, 10.08.2009 в 18:52.
Ответить с цитированием
  #18 (permalink)  
Старый 11.08.2009, 02:44
Аватар для leprosus
Новичок на форуме
Отправить личное сообщение для leprosus Посмотреть профиль Найти все сообщения от leprosus
 
Регистрация: 10.08.2009
Сообщений: 4

Сообщение от Octane Посмотреть сообщение
Не могу не прорекламировать в этой теме Цепочки вызовов в JavaScript-фреймворке js-core
Тогда встречный вопрос:
Как всё это сделать в рамках одной функции, как в js-core, не разделяя на function F() и function dom() ?
Ответить с цитированием
  #19 (permalink)  
Старый 11.08.2009, 03:39
Отправить личное сообщение для Octane Посмотреть профиль Найти все сообщения от Octane  
Регистрация: 10.07.2008
Сообщений: 3,873

В js-core, вместо второй функции, рекурсия добавлена, пример будет выглядеть следующим образом:

function dom(arg) {
   if(this.dom) return new dom(typeof arg == "string" ? document.getElementById(arg) : arg);
   this.node = arg;
}
 
dom.prototype = {
   append: function(arg) { 
      return new dom(this.node.appendChild(typeof arg == "string" ? document.createElement(arg) : arg));
   },
   text: function(str) {
      if(typeof str == "undefined") return this.node.innerText || this.node.textContent;
      this.node.innerHTML = "";
      this.node.appendChild(document.createTextNode(str));
      return this;
   }
};

dom(document.body).append("h1").text("It works!");


Используется тот факт, что одна и таже функция может вызываться явным образом и в конструкторе. При вызове явным образом this указывает на window, так определяем, что нужно рекурсивно вызвать эту же фунции в конструкторе с тем же аргументом.

Последний раз редактировалось Octane, 13.03.2010 в 21:32. Причина: исправил имена переменных
Ответить с цитированием
  #20 (permalink)  
Старый 13.03.2010, 20:51
Аспирант
Отправить личное сообщение для YISHIMITSY Посмотреть профиль Найти все сообщения от YISHIMITSY
 
Регистрация: 04.11.2008
Сообщений: 61

Octane,
2-й пример почему-то не работает...
Ответить с цитированием
Ответ



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

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