Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Объекты, прототипы и циклы (https://javascript.ru/forum/misc/32156-obekty-prototipy-i-cikly.html)

Maxmaxmахimus 08.10.2012 15:20

нашел, проблема в
jQuery.extend(true, this.defaultOptions, options);

jQuery.extend изменяет и возвращает this.defaultOptions.

таким образом мы всем присваиваем в свойство this.options ссылку на один и тот же обьект this.defaultOptions)))))

лол можешь проверить

objs[1].options === objs[3].options //true
objs[2].options  === objs[1].defaultOptions //true

bFree 08.10.2012 15:29

Обоже мой. Я уже запарился перечитывать про прототипы, думал, что где-то в prototype пересекаются ссылки.

Оказалось, что я не умею читать документацию к jquery. Огромное спасибо!

Maxmaxmахimus 08.10.2012 15:31

используй лучше это)))


function extendObject( parent, child ) {
	function F (){}
	F.prototype = parent;

	var instance = new F;
	for ( var key in child )
	  instance[key] = child[key];

	return instance
}


за место
jQuery.extend(true, this.defaultOptions, options);


пиши

extendObject( this.defaultOptions, options );


______________________________________
п.с. если бы не существовало ишака, то функция extendObject выглядела бы вообще так
function extendObject (){
    child.__proto__ = parent;
    return child;
}

и работала бы в сотни раз быстрее.
но мир не без ослов))

bFree 08.10.2012 16:39

А как можно при помощи Class вызвать конструктор родителя?
В Coffescript есть вызов "super", а тут есть такое?

Maxmaxmахimus 08.10.2012 23:02

Есть конечно)) эту функцию писали профессионалы javascript)

this.super() внутри дочернего метода вызовет перекрытый мтеод родителя

function Class(g,h){var d=h||g,a=h?g:null,e=Class.overname||"super",f=function(){if(this.__construct__)return this.__construct__.apply(this,arguments)},i=function(){};i.prototype=a?a.prototype:Class.prototype;d.prototype=new i;f.prototype=new d(f,d.prototype);var c=f.prototype,b;for(b in c)c.hasOwnProperty(b)&&c[b]instanceof Function&&(a=d.prototype[b])&&function(b,d,a){c[a]=function(){var a=this[e];this[e]=d;var c=b.apply(this,arguments);a?this[e]=a:delete this[e];return c}}(c[b],a,b);return f};







var Animal = new Class( function () {
	this.run = function () {
		alert( 'this run!' )
	};
} );



var Cat = new Class( Animal, function () {
	this.run = function (){
		this.super(); // вызываем родительский перекрытый
		alert('...and jump!' ) // добавляем коту дополнительный функционал
	};
} );



var cat = new Cat;
cat.run(); // 'this run!'   // '...and jump!'


п.с. вот это вот слово super можно задавать в Class.overname = 'trololo' если слово super не устраивает))

И кстати

cat instanceof Cat    // true
cat instanceof Animal // true
cat instanceof Class  // true


А так же

Class.prototype.qq = 11;
Animal.prototype.ww = 77;

cat.qq // 11
cat.ww // 77

ну ты понял ;)

я же говорю это обычная обертка над прототипным наследованием)))) просто дико удобная

Maxmaxmахimus 09.10.2012 02:55

На самом деле у этой функции еще есть много фишек, все сразу и не опишешь)

bFree 09.10.2012 11:05

Отлично. Это то что нужно. Спасибо!

Maxmaxmахimus 09.10.2012 17:56

Да а еще можно статические свойства добавлять) например так



function Class(g,h){var d=h||g,a=h?g:null,e=Class.overname||"super",f=function(){if(this.__construct__)return this.__construct__.apply(this,arguments)},i=function(){};i.prototype=a?a.prototype:Class.prototype;d.prototype=new i;f.prototype=new d(f,d.prototype);var c=f.prototype,b;for(b in c)c.hasOwnProperty(b)&&c[b]instanceof Function&&(a=d.prototype[b])&&function(b,d,a){c[a]=function(){var a=this[e];this[e]=d;var c=b.apply(this,arguments);a?this[e]=a:delete this[e];return c}}(c[b],a,b);return f};






var Cat = new Class( function ( static ) {

	// static ссылается на то, что возвращает функция Class (на то что потом кладется в Cat)
	static.count = 0; // статическое свойство count 

	this.__construct__ = function () {
		static.count++
	};
} );


// теперь в Cat лежит класс котов, и через этот класс можно получить доступ к статическим свйоствам ни создав ни одного кота

alert( Cat.count ) //0

new Cat;
new Cat;
new Cat;

alert( Cat.count ) //3

Hekumok 10.10.2012 11:14

Maxmaxmахimus, когда снова создашь топик с этими классами?

nerv_ 10.10.2012 11:47

Цитата:

Сообщение от Hekumok
Maxmaxmахimus, когда снова создашь топик с этими классами?

Maxmaxmахimus, видишь, народ требует хлеба и зрелищ :)


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