Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 20.07.2011, 21:21
Новичок на форуме
Отправить личное сообщение для thelostdoom Посмотреть профиль Найти все сообщения от thelostdoom
 
Регистрация: 26.06.2009
Сообщений: 7

Extend через Object
Кто, что может сказать о так методе наследования

Для меня оно более лаконично выглядит

Object.prototype.extend = function(Parent) {
	var F = function() { }
	F.prototype = Parent.prototype
	this.prototype = new F()
	this.prototype.constructor = this
	this.superclass = Parent.prototype
};

function Animal(name, walkSpeed) {

	// объявить приватную переменную
	var speed = walkSpeed

	// объявить открытую переменную
	this.distance = 0

	// добавить метод, использующий private speed
	this.walk = function(time) {
		this.distance = this.distance + time*speed
	}

	// добавить метод, использующий private name
	this.toString = function() {
		return name+" на расстоянии "+this.distance
	}
}

function Bird(name, walkSpeed, flySpeed) {
	// вызов родительского конструктора
	Bird.superclass.constructor.call(this, name, walkSpeed)

	this.fly = function(time) {
		this.distance = this.distance + time*flySpeed
	}
}

Bird.extend(Animal);

bird = new Bird("Птыц", 1, 10)

bird.walk(3)

alert(bird) // => Птыц на расстоянии 3

bird.fly(2)

alert(bird) // => Птыц на расстоянии 23
Ответить с цитированием
  #2 (permalink)  
Старый 20.07.2011, 21:25
Особый гость
Посмотреть профиль Найти все сообщения от monolithed
 
Регистрация: 02.04.2010
Сообщений: 4,260

Сообщение от thelostdoom
Кто, что может сказать о так методе наследования
вы только что убили котенка
Ответить с цитированием
  #3 (permalink)  
Старый 20.07.2011, 21:29
Новичок на форуме
Отправить личное сообщение для thelostdoom Посмотреть профиль Найти все сообщения от thelostdoom
 
Регистрация: 26.06.2009
Сообщений: 7

Сообщение от monolithed Посмотреть сообщение
вы только что убили котенка
чем же я его убил?
Ответить с цитированием
  #4 (permalink)  
Старый 20.07.2011, 21:34
Особый гость
Посмотреть профиль Найти все сообщения от monolithed
 
Регистрация: 02.04.2010
Сообщений: 4,260

Сообщение от thelostdoom
чем же я его убил?
Вы ивиняюсь "нагадили" в протопип Object, так делать никогда не стоит (за исключением нативных имплементаций, которые отсутствуют в старых браузерах). Если этот код пойдет в паблик - у других разработчиков может быть очень много бед.

Вот завтра Geko добавят себе в движок такой же одноименны метод, но с иным смыслом, и у тех кто будет использовать ваш код поломается весь функционал сайта.

Последний раз редактировалось monolithed, 20.07.2011 в 21:43.
Ответить с цитированием
  #5 (permalink)  
Старый 20.07.2011, 21:45
Новичок на форуме
Отправить личное сообщение для thelostdoom Посмотреть профиль Найти все сообщения от thelostdoom
 
Регистрация: 26.06.2009
Сообщений: 7

Ну, а если изначально делать все по такому принципу?
Иногда "гадить" в String очень выгодно.
Ответить с цитированием
  #6 (permalink)  
Старый 20.07.2011, 22:19
Аватар для kobezzza
Быдлокодер;)
Отправить личное сообщение для kobezzza Посмотреть профиль Найти все сообщения от kobezzza
 
Регистрация: 19.11.2010
Сообщений: 4,338

Можете со мной не согласится, но имхо, расширение прототипа стандартных объектов - ето не есть гуд в 90% случаев)
__________________
kobezzza
code monkey
Ответить с цитированием
  #7 (permalink)  
Старый 20.07.2011, 22:32
Особый гость
Посмотреть профиль Найти все сообщения от monolithed
 
Регистрация: 02.04.2010
Сообщений: 4,260

Сообщение от thelostdoom
Иногда "гадить" в String очень выгодно.
Не путайте хрен с редькой:

Object.prototype.foo = 'o_O';
alert([10..foo, {}.foo, [].foo]); // этот ахтунг будет во всех объектах


Неправда ли забавно?
Object.prototype[0] = 'o_O';
alert(Array[0]);

Последний раз редактировалось monolithed, 20.07.2011 в 22:37.
Ответить с цитированием
  #8 (permalink)  
Старый 20.07.2011, 23:14
Новичок на форуме
Отправить личное сообщение для thelostdoom Посмотреть профиль Найти все сообщения от thelostdoom
 
Регистрация: 26.06.2009
Сообщений: 7

Сообщение от monolithed Посмотреть сообщение
Не путайте хрен с редькой:
Я и не путаю. В таки случаях extend можно изолировать специфическим именем "__extend",
Я думаю такая реализация может иметь плюсы в определенных условиях
Ответить с цитированием
  #9 (permalink)  
Старый 21.07.2011, 01:21
Профессор
Отправить личное сообщение для Sweet Посмотреть профиль Найти все сообщения от Sweet
 
Регистрация: 16.03.2010
Сообщений: 1,618

А почему в прототип Object? Куда как логичнее в Function.
Ответить с цитированием
  #10 (permalink)  
Старый 21.07.2011, 13:19
Новичок на форуме
Отправить личное сообщение для Kolyaj Посмотреть профиль Найти все сообщения от Kolyaj
 
Регистрация: 19.02.2008
Сообщений: 9,177

Таки да, Object.prototype тут не нужен. Вот мой вариант
https://github.com/Kolyaj/CrossJS/bl...nction.js#L105
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
eMail через JS konstantinopol Общие вопросы Javascript 15 12.01.2015 10:06
кеширование HTML переданого через ajax BorisBritva jQuery 6 02.04.2011 01:23
Передача контекста через setTimeout decadent jQuery 3 10.02.2011 19:01
object и object HTMLFormElement Paul56 Общие вопросы Javascript 2 17.07.2009 08:29
XMLHTTPRequest передача имя через POST dds AJAX и COMET 0 14.08.2008 14:44