OOP JavaScript och Enkel Klassinstansiering
Först och främst, jag ber om ursäkt om detta är en dum fråga. Jag har skrivit två kodsnuttar nedan. Den första kodsnutten hittade jag här skriven av John Resig och utan tvekan är han en av de bästa, och den andra kodsnutten är modifierad av mig från originalkoden bara för att förstå skillnaden, men jag är faktiskt inte säker på vad skillnaden mellan de båda är och vad jag kan och inte kan göra med båda jämfört. Snälla, någon hjälp mig att förstå skillnaden. Tack.
function makeClass(){
return function(args){
if ( this instanceof arguments.callee ) {
if ( typeof this.init == "function" )
this.init.apply( this, args.callee ? args : arguments );
}
else return new arguments.callee( arguments );
};
}
var User = makeClass();
User.prototype.init = function(first, last){
this.name = first + " " + last;
};
var user = User("John", "Resig");
console.log(user);
Modifierad version
function myClass(args)
{
if (this instanceof arguments.callee)
{
this.init = function(first, last){
this.name = first + " " + last;
};
this.init.apply( this, args.callee ? args : arguments );
}
else return new arguments.callee( arguments );
}
var obj = new myClass('Sheikh', 'Heera');
console.log(obj);
Varför ska jag använda objektets prototyp för att lägga till en metod (efter att ha skapat en instans) istället för att skriva den inuti konstruktorn?
Svar #1
En huvudorsak till att definiera en metod på objektets prototyp istället för i konstruktorn är att metoden som definieras i prototypen är omedelbart tillgänglig för och delad av (i minnet) alla instanser av objektet.
Genom att definiera metoden i konstruktorn är den metoden specifik för instansen av objektet som skapar den. Om du instansierar 10 av ditt objekt, kommer du att ha 10 kopior av metoden i minnet, även om de alla är samma, tills du ändrar en av dem.
För att vara tydlig, med delad mellan objektinstanser, menar jag inte att säga att metoden fungerar statiskt på några egenskaper den får tillgång till. De egenskaperna (om de definieras med this.) är fortfarande instansspecifika. Det är bara det att du inte slutar med att definiera flera kopior av samma metod.