JavaScript jest specyficzny - aby zrozumieć o co mi chodziło przeczytaj także komentarze w przykładowych krótkich kodach
zależy co rozumiesz tutaj przez extend - jeśli to co np. w PHP extends rozszerzanie klas to obiekt przekazywany w metodzie extend nie powinien nadpisywać zmiennych - nadpisywanie powinno być w drugą stronę... nie działa także instanceof...
chyba, że chciałeś w drugą stronę, że dla przykładu cTest.extend(cTest2) - że cTest2 zostanie rozszerzone o cTest - jednak instanceof także nie działa gdy sobie zrobimy obiekt oTest2 = new cTest2; alert(oTest2 instanceof cTest);
dla przykładu tutaj np. zamiast zapisać:
var TestClass = JS.Class({
a: 9,
methodA : function (param) {
//method body
$('#hello').append(param);
}
});
var oTest = new cTest;
var cExtendedTestClass = TestClass.extend(oTest);
można zapisać:
var cExtendedTestClass = JS.Class({
a: 9,
methodA : function (param) {
//method body
$('#hello').append(param);
}
}).extend(oTest);
// lub ...extend(cTest)
// gdzie oTest - obiekt, cTest - klasa - czyli także obiekt, tyle, że to konstruktor i funkcja...
dokładniej o co mi chodzi zawarłem w przykładach
var cTest = function(){
};
cTest.prototype = {
a: 2,
b: 3
};
//sample js class
var TestClass = JS.Class({
a: 9,
methodA : function (param) {
//method body
$('#hello').append(param);
}
});
var oTest = new cTest;
var cExtendedTestClass = TestClass.extend(oTest);
var oExtendedTestClass = new cExtendedTestClass();
// return false, 2, 3, false;
// powinno być: true, 9, 3 ?jaki może ma być inna logika?
alert([oExtendedTestClass instanceof cTest, oExtendedTestClass.a, oExtendedTestClass.b, oTest instanceof cExtendedTestClass]);
var cNewClass = function(){};
// extend cTest
cNewClass.prototype = new cTest;
// other methods
cNewClass.prototype.a = 9;
cNewClass.prototype.fCos = function(){};
cNewClass.prototype.fOther = function(){};
var oNewClass = new cNewClass;
// return true, 9, 3;
// powinno być: true, 9, 3
alert([oNewClass instanceof cTest, oNewClass.a, oNewClass.b]);
[edit]
jeszcze zapomniałem - przyczepiłbym się jeszcze do zmiennych "statycznych" - wiem, że wielu używa tej nazwy do tego typu konstrukcji, ale dla mnie używając tego określenia to co się robi na zmiennych powinno się dziać np. tak jak w PHP, że nie ważne z którego obiektu próbujesz się odwołać - czy to z wnętrza czy z zewnątrz [pomijam protected i public] to we wszystkich obiektach także utworzonych z dziedziczonych klas ta zmienna powinna mieć tą samą wartość... jak dla mnie skoro obiekty są przekazywane przez referencję to do prototypu dodałbym taki obiekt o stałej nazwie i co konstruktora funkcji o tej samej nazwie np. statyczne - czyli w efekcie cTest.statyczne['jakaś zmienna'] - a wewnątrz po stworzeniu obiektu np. this.statyczne['jakaś zmienna']...
ale to tak ogólnikowo piszę tylko ;] - jak to robiłeś, czy w prototypie konstruktora czy inaczej to kodu nie analizowałem...
nie sprawdzałem czy do extend można dać funkcję - no wiadomo, że można gdyż funkcja jest także obiektem, ale miałem na myśli, czy sprawdzasz, że jest to instanceof Function - gdyż jeśli tak to pasuje potraktować ją jako konstruktor lub jeśli rozszerzasz w drugą stronę to zamiast bezpośrednio iterować po funkcji to powinno się po jej prototypie...