Что это значит ?

pilot911

Новичок
Что это значит ?

PHP:
Clazz.extend = function(def) {
    var classDef = function() {
        if (arguments[0] !== Clazz) { this.construct.apply(this, arguments); }
    };
    
    var proto = new this(Clazz);
    var superClass = this.prototype;
что значит конструкция

var proto = new this(Clazz);


первый раз такое встречаю... (http://ajaxpatterns.org/Javascript_Inheritance)
 

dr-sm

Новичок
это сложно объяснить :D
добавь две стороки
alert(typeof this);
alert(this.toSource());
перед
var proto = new this(Class);
и помедитируй над выводом в файрфоксе
 

Adelf

Administrator
Команда форума
pilot911
Ты б весь код привел :) А то сложно догадатсья по твоему отрывку.

В контексте этой функции this - это Class.
Но Class в свою очередь это функция (function Class() { }); Поэтому new this() это просто создание экземпляра обьекта, которого собираются экстендить.

А передают туда Class - вот для этого видать:
if (arguments[0] !== Class) {this.construct.apply(this, arguments);}
Это конструктор нового класса, судя по всему.
Както так.. я пока не совсем уверен :)
Не люблю я эти яваскриптовые выкрутасы.
 

pilot911

Новичок
Автор оригинала: Adelf
pilot911
Ты б весь код привел :) А то сложно догадатсья по твоему отрывку.

В контексте этой функции this - это Class.
Но Class в свою очередь это функция (function Class() { }); Поэтому new this() это просто создание экземпляра обьекта, которого собираются экстендить.

А передают туда Class - вот для этого видать:
if (arguments[0] !== Class) {this.construct.apply(this, arguments);}
Это конструктор нового класса, судя по всему.
Както так.. я пока не совсем уверен :)
Не люблю я эти яваскриптовые выкрутасы.
даа.. это попытка эмулировать наследование через классы - можно вызывать контрукторы родителей, например

вот полный код

PHP:
//Defines the top level Class
function Class() { }
Class.prototype.construct = function() {};
Class.extend = function(def) {
    var classDef = function() {
        if (arguments[0] !== Class) { this.construct.apply(this, arguments); }
    };
    
    var proto = new this(Class);
    var superClass = this.prototype;
    
    for (var n in def) {
        var item = def[n];                        
        if (item instanceof Function) item.$ = superClass;
        proto[n] = item;
    }

    classDef.prototype = proto;
    
    //Give this new class the same static extend method    
    classDef.extend = this.extend;        
    return classDef;
};



пример работы:



PHP:
var BaseClass = Class.extend({
    construct: function() {
        //BaseClass constructor code goes here
    },
        
    getName: function() {
        return "BaseClass(" + this.getId() + ")";
    },
    
    getId: function() {
        return 1;
    }
});

var SubClass = BaseClass.extend({
    construct: function() {
        //SubClass constructor code goes here
    },

    //Override BaseClass's getName method
    getName: function() {
        return "SubClass(" + this.getId() + ") extends " +
            arguments.callee.$.getName.call(this);
    },
    
    //Override BaseClass's getId method
    getId: function() {
        return 2;
    }
});

var TopClass = SubClass.extend({
    //Override SubClass's getName method
    getName: function() {
        //Calls the getName() method of SubClass
        return "TopClass(" + this.getId() + ") extends " +
            arguments.callee.$.getName.call(this);
    },
    
    //Override SubClass's getId method
    getId: function() {
        //Just like the last example, this.getId()
        //always returns the proper value of 2.        
        return arguments.callee.$.getId.call(this);
    }
});

//Alerts "TopClass(2) extends SubClass(2) extends BaseClass(2)"
alert(new TopClass().getName());



http://ajaxpatterns.org/Javascript_Inheritance#Direct_Inheritance_.28ThinWire_Ajax_Framework.29
 

dr-sm

Новичок
там значение имеет контекст вызова, те
var Omg = Class.extend({...}); тут this будет Class
var Wtf = Omg.extend({...}); тут this будет Omg
 

dimagolov

Новичок
pilot911, а зачем тебе понадобился такой синтаксический сахар? ты лучше научись пользоваться замыканиями и прототипами и если после этого тебе чего-то не будет хватать, то воспользуйся сахарком. просто не нужно пытаться использовать "классический" ООП на JS. фишка JS именно в прототипной модели и возможности менять свойства объектов "на лету", именно на использование этих фишек и стоит ориентироваться.
 

pilot911

Новичок
Автор оригинала: dimagolov
pilot911, а зачем тебе понадобился такой синтаксический сахар? ты лучше научись пользоваться замыканиями и прототипами и если после этого тебе чего-то не будет хватать, то воспользуйся сахарком. просто не нужно пытаться использовать "классический" ООП на JS. фишка JS именно в прототипной модели и возможности менять свойства объектов "на лету", именно на использование этих фишек и стоит ориентироваться.
прототипы я умею использовать, однако они не всегда удобны

если использовать вышеприведенный класс, то вызов родителя будет происходить без использования имени прототипа:

PHP:
Core.Shape = {

refresh: function() {
	//call base class refresh method
	arguments.callee.$.refresh.apply(this, arguments);

на прототипах пришлось бы вызывать с именем класса-родителя:

PHP:
Core.Shape = {
refresh: function() {
	//call base class refresh method
	BaseClass.refresh(arguments);

если я все правильно понял
 

Adelf

Administrator
Команда форума
pilot911
правильно понял. Но я бы порекомендовал послушать то, что говорит dimagolov. тебе действительно нужен классический ООП в js?
 

dimagolov

Новичок
pilot911, расскажи зачем именно ты в практической задаче на JS используешь классическое наследование.

-~{}~ 04.03.10 10:51:

просто я обхожусь без него и вполне доволен, но может я чего не знаю и есть ситуации когда это реально полезно
 

Adelf

Administrator
Команда форума
Есть. Но почти всегда это очень крупные иерархии классов.
ExtJS например не представить без данного подхода.
Поэтому и спрашиваю пилота, у тебя действительно такая задача, где нужно это городить?
 

pilot911

Новичок
да разницы нет за исключением того, о чем я написал выше :)

-~{}~ 04.03.10 18:06:

Автор оригинала: Adelf
Есть. Но почти всегда это очень крупные иерархии классов.
ExtJS например не представить без данного подхода.
Поэтому и спрашиваю пилота, у тебя действительно такая задача, где нужно это городить?
задача средних размеров, создаю редактор бизнес-процессов на SVG и VML, а там есть абстрактные классы, классы блоков, стрелок, границ элементов и тп..
 
Сверху