Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Extend через Object (https://javascript.ru/forum/misc/18942-extend-cherez-object.html)

thelostdoom 20.07.2011 21:21

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

monolithed 20.07.2011 21:25

Цитата:

Сообщение от thelostdoom
Кто, что может сказать о так методе наследования

вы только что убили котенка

thelostdoom 20.07.2011 21:29

Цитата:

Сообщение от monolithed (Сообщение 114510)
вы только что убили котенка

чем же я его убил?

monolithed 20.07.2011 21:34

Цитата:

Сообщение от thelostdoom
чем же я его убил?

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

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

thelostdoom 20.07.2011 21:45

Ну, а если изначально делать все по такому принципу?
Иногда "гадить" в String очень выгодно.

kobezzza 20.07.2011 22:19

Можете со мной не согласится, но имхо, расширение прототипа стандартных объектов - ето не есть гуд в 90% случаев)

monolithed 20.07.2011 22:32

Цитата:

Сообщение от thelostdoom
Иногда "гадить" в String очень выгодно.

Не путайте хрен с редькой:

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


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

thelostdoom 20.07.2011 23:14

Цитата:

Сообщение от monolithed (Сообщение 114528)
Не путайте хрен с редькой:

Я и не путаю. В таки случаях extend можно изолировать специфическим именем "__extend",
Я думаю такая реализация может иметь плюсы в определенных условиях

Sweet 21.07.2011 01:21

А почему в прототип Object? Куда как логичнее в Function.

Kolyaj 21.07.2011 13:19

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


Часовой пояс GMT +3, время: 19:14.