Модераторы: Sardar, Aliance
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Прототипное наследование с замыканием, Как наследовать одну замкнутую функцию 
:(
    Опции темы
platedz1
Дата 12.1.2013, 01:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 45
Регистрация: 12.1.2013

Репутация: нет
Всего: нет



Здравствуйте. Подскажите, пожалуйста. 

Есть функция конструктор


Код

a1 = new function(i){

function a_privar(e) { return "a_privat"; }

return {

aa:  function (d) { alert(d+a_privar()+(++i));}

}

}(3)

a1.aa("--");



Мне нужно расширить функцию функцией b1


Код

b1 = function(){

function b_privat(e) { return "b_privat"; }

return {

bb:  function (d) {alert(d+b_privat()+(++ii)); }

}}()



Как это сделать?
PM MAIL WWW   Вверх
skyboy
Дата 12.1.2013, 02:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 10
Всего: 260



Цитата(platedz1 @  12.1.2013,  00:10 Найти цитируемый пост)
расширить функцию функцией b1

это что еще значит?
можно ли доопределить в функции-конструкторе дополнительные "приватные переменные"? нет, функция уже определена.
можно ли в прототип созданного объекта запихнуть еще функции? да, через конструкцию a1.constructor.prototype.<имя метода> = …
будет ли все это иметь смысл для одноразового конструктора-анонимной функции и объекта-синглтона, созданного ею? не думаю.
PM MAIL   Вверх
platedz1
Дата 12.1.2013, 11:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 45
Регистрация: 12.1.2013

Репутация: нет
Всего: нет



Спасибо за ответ. Приватные функции b1 в принципе нужны только методам функции b1. Т.е. мне нужно передать методы из b1 в a1, но чтобы в методе b1 остались рабочие приватные функции.
Соответственно доопределять в функцию a1 мне приватные функции не надо?
Смысл в том, что у меня уже есть две такие функции, но одна мне нужна только на одной странице. При этом мне также использовать в ней методы из другой функции. И все это я хотел сделать через наследование, т.к. последнее время довольно много времени уделил его изучению.

Это сообщение отредактировал(а) platedz1 - 12.1.2013, 12:00
PM MAIL WWW   Вверх
skyboy
Дата 12.1.2013, 13:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 10
Всего: 260



прости, я опять не понял, в чем задача.
мое предыдущее сообщение было с посылом "не понял, что тебе надо, но на всякий случай отвечу на отдельные части сообщения, вдруг, дам нужную информацию". теперь я даже этого сделать не могу.
PM MAIL   Вверх
platedz1
Дата 12.1.2013, 14:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 45
Регистрация: 12.1.2013

Репутация: нет
Всего: нет



Грубо говоря нужно, чтобы выполнилось 

b1.aa("--");

При этом в a1 есть приватное свойство a_privat(), которое не надо передавать в b1, и которое так и должно остаться приватным и только для методов a1, но нужно, чтобы оно выполнилось в функции потомке с методом b1.aa("--");

Добавлено через 9 минут и 34 секунды
Если следовать логике, что мы не копируем методы, а только даем ссылку на метод, то задача кажется мне в принципе тем или иным образом решаемой, т.к. мы обращаемся к методам объекта в его контексте, т.е. там где ему доступны именно его приватные функции. И если я не прав, и это невозможно сделать, то хотелось бы знать почему. Буду крайне признателен за ответ.

Это сообщение отредактировал(а) platedz1 - 12.1.2013, 14:26
PM MAIL WWW   Вверх
skyboy
Дата 12.1.2013, 15:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 10
Всего: 260



Тебе надо на объекте new b1() выполнить метод аа, как будто бы он его "родной"?
Код

var target = new b1();
a1.aa.call(target, "--");

PM MAIL   Вверх
platedz1
Дата 12.1.2013, 18:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 45
Регистрация: 12.1.2013

Репутация: нет
Всего: нет



 Спасибо за ответ, но к сожалению не сработало. 
И если я правильно понимаю, то Вы передаете this через call, но при этом сразу же выполняете метод "aa" в функции "a1". 
Я же пытаюсь выполнить метод "aa" в функции "b1". 
Причем хочу это сделать за счет наследования. 
PM MAIL WWW   Вверх
platedz1
Дата 12.1.2013, 20:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 45
Регистрация: 12.1.2013

Репутация: нет
Всего: нет



В принципе так например работает.

Код

b1 = new function(i){

function b_privar(e) { return "b_privat"; }
    return {
    
        bb:  function (d) { this.aa(d+b_privar()+(++i)); }
        
        }
}(3)

a1 =  new function(){

function a_privat(e) { return "a_privat"; }
    return {
    
        aa:  function (d) { alert(d+a_privat()); }
    
        }
}
b1.bb.call(a1, "-d-d-d-d");

Но это не то, т.к. я не имею возможности вызвать метод aa, если он не вызывается каким-нибудь из методов b1

Это сообщение отредактировал(а) platedz1 - 12.1.2013, 21:19
PM MAIL WWW   Вверх
skyboy
Дата 13.1.2013, 08:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 10
Всего: 260



Цитата(platedz1 @  12.1.2013,  19:56 Найти цитируемый пост)
Но это не то, т.к. я не имею возможности вызвать метод aa

то есть, другими словами, ты не наследуешь методы, объявленные во втором конструкторе. но так и наследование-то у тебя — где?
Код

function constructor_A () {
  this.a = function() {
       alert('A');
  }; 
}
function constructor_B () {
  this.b = function() {
       alert('B');
       this.a();
  }
}
constructor_B.prototype = new constructor_A(); // вот это и есть наследование

(new constructor_B()).b();


PM MAIL   Вверх
platedz1
Дата 13.1.2013, 14:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 45
Регистрация: 12.1.2013

Репутация: нет
Всего: нет



Спасибо за ответ.

Наследования у меня нет, просто c call, по крайней мере таким способом реализовать не получится я думаю.

А еще Ваш код вот так уже не работает.

Код

function constructor_A () {

  return { a : function() {
       alert('A');
     }  
  }; 
}
function constructor_B () {
 return{ b : function() {
       alert('B');
     }
  }
}
constructor_B.prototype = new constructor_A(); // вот это и есть наследование
(new constructor_B()).a();

PM MAIL WWW   Вверх
skyboy
Дата 13.1.2013, 14:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 10
Всего: 260



Цитата(platedz1 @  13.1.2013,  13:02 Найти цитируемый пост)
Наследования у меня нет

в то время, как в заголовке слово "наследование" имеется.
задачу формулируешь абстрактно. пояснений нет.
поди догадайся — что ты вкладываешь в "наследовать метод, не применяя наследование"
Цитата(platedz1 @  13.1.2013,  13:02 Найти цитируемый пост)
А еще Ваш код вот так уже не работает.

потому что внутри constructor_B вместо this(у которого прототипом был бы объект new constructor_A() и который так получил бы в наследство метод a()) ты возвращаешь на лету созданный объект:
 return{ b : function() {
       alert('B');
     }
  }
у которого прототип — обычный Object, а не new constructor_A
зачем ты так делаешь, для меня не ясно. то, что таким образом объект, созданный constructor_B() не наследует методы, описанные в constructor_A — вполне закономерно.
PM MAIL   Вверх
platedz1
Дата 13.1.2013, 18:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 45
Регистрация: 12.1.2013

Репутация: нет
Всего: нет



Большое спасибо за ответ, теперь уже несколько понятнее.
Я действительно хочу организовать связывание двух функций через наследование, а пример c call попробовал как вариант, но он не подходит как минимум тем, что привязывает (если в место call к примеру использовать bind) новую функцию к методу внутри функции, не говоря уже что там отсутствует наследование.


А если я буду возвращать не вновь созданный объект, а предопределенный 

Код

resurl = { b : function() {
       alert('B');
     }

return result;


То как в таком случае возможно организовать подобное насследование?
PM MAIL WWW   Вверх
ksnk
Дата 13.1.2013, 20:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 84
Всего: 386



platedz1, Может, начать следует с того, что хочется получить?

Что есть? Как хочется писать? Что в итоге должно получится? 
Иначе конструируются какие-то странные конструкции со странными свойствами, из которых никак не понять зачем они нужны...



--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
platedz1
Дата 13.1.2013, 21:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 45
Регистрация: 12.1.2013

Репутация: нет
Всего: нет



Есть фукнция "a1" как описано выше. 
Есть фукнция "b1", тоже как описано выше.
В принципе отличие у них только в том, что "a1" обязательно должна передавать "i"
Функция b1 мне нужна на одной странице только.
Поэтому я хочу передать все ее методы и свойства в фукнцию "a1"
Чтобы в результате выполнилось a1.bb("--");
Изучаю прототипы, поэтому хотел сделать это за счет прототипов.

Это сообщение отредактировал(а) platedz1 - 13.1.2013, 21:48
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Форум для вопросов, которые имеются в справочниках, но их поиск вызвал затруднения, или для разработчика требуется совет или просьба отыскать ошибку. Напоминаем: 1) чётко формулируйте вопрос, 2) приведите пример того, что уже сделано, 3) укажите явно, нужен работающий пример или подсказка о том, где найти информацию.
 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | JavaScript: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1132 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.