нашел, проблема в
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 |
Обоже мой. Я уже запарился перечитывать про прототипы, думал, что где-то в prototype пересекаются ссылки.
Оказалось, что я не умею читать документацию к jquery. Огромное спасибо! |
используй лучше это)))
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;
}
и работала бы в сотни раз быстрее. но мир не без ослов)) |
А как можно при помощи Class вызвать конструктор родителя?
В Coffescript есть вызов "super", а тут есть такое? |
Есть конечно)) эту функцию писали профессионалы 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 ну ты понял ;) я же говорю это обычная обертка над прототипным наследованием)))) просто дико удобная |
На самом деле у этой функции еще есть много фишек, все сразу и не опишешь)
|
Отлично. Это то что нужно. Спасибо!
|
Да а еще можно статические свойства добавлять) например так
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
|
Maxmaxmахimus, когда снова создашь топик с этими классами?
|
Цитата:
|
| Часовой пояс GMT +3, время: 15:44. |