Ce stil folosiți pentru crearea unei "clase"?

Există câteva modalități de a obține un comportament asemănător claselor în javascript, cele mai frecvente par a fi prototip bazate pe aceasta:

function Vector(x, y, x) {
    this.x = x;
    this.y = y;
    this.z = z;
    return this;
}

Vector.prototype.length = function() { return Math.sqrt(this.x * this.x ... ); }

și abordări bazate pe închidere similară cu

function Vector(x, y, z) {
    this.length = function() { return Math.sqrt(x * x + ...); }
}

Din diverse motive, aceasta din urmă este mai rapidă, dar am văzut (și scriu frecvent) versiunea prototip și am fost curios în ceea ce privește ceea ce fac ceilalți.

0
fr hi bn
Testele mele au arătat că abordarea bazată pe închidere este mai lentă. Trebuie să instanțiați o închidere separată pentru fiecare obiect. Abordarea prototipului împărtășește metodele cu toate instanțele.
adăugat autor Juan Mendes, sursa

7 răspunsuri

Din fericire, folosesc prototype.js , care oferă niște împachetări frumoase. Deci, puteți face acest lucru:

var Person = Class.create({
    initialize: function(name) {
        this.name = name;
    },
    say: function(message) {
        return this.name + ': ' + message;
    }
});

Prototype.js Documentație: Definirea clasei și a moștenirii

0
adăugat
Nu cred că OP a cerut un ambalaj care ascunde detaliile. El a vrut să știe de ce ați alege fie abordarea, astfel încât el poate cântări beneficiile
adăugat autor Juan Mendes, sursa

Ei bine, nu prea am o opinie specială în acest sens. Obișnuiește, de obicei, să folosesc abordările bazate pe închideri, pentru că menține codul mai simplu managerului. Dar, m-am găsit folosind prototipuri pentru metode care au o mulțime de linii de cod.

0
adăugat

Atribuirea funcțiilor prototipului este mai bună (pentru metodele publice), deoarece toate instanțele clasei vor împărți aceeași copie a metodei. Dacă atribuiți funcția în interiorul constructorului ca în cel de-al doilea exemplu, de fiecare dată când creați o instanță nouă, constructorul creează o nouă copie a funcției de lungime și o atribuie doar acelei instanțe.

Cu toate acestea, această tehnică din urmă este utilă dacă doriți fiecare copie pentru a avea copia proprie, utilizarea principală a acelei ființe fiind aceea de a face metode private / privilegiate care au acces la variabilele private declarate în interiorul constructorului și moștenite prin mecanism de închidere.

Douglas Crockford are un bun rezumat .

0
adăugat

Aveți, de asemenea, posibilitatea de a alege:

function Vector(x, y, z) {
  function length() {
    return Math.sqrt(x * x + ...);
  }
}

Care este probabil la fel de lent ca exemplul doi, dar seamănă mai mult cu Java / C# și este puțin mai explicit.

0
adăugat

Există, de asemenea, obiectul abordării literale a prototipului:

var Vector = function(){};

Vector.prototype = {
  init:function(x,y,z) {
    this.x = x;
    this.y = y;
    this.z = z;
  },
  length:function() {
    return Math.sqrt(x * x + ...);
  }
};

var v1 = new Vector();
v1.init(1,2,3);
0
adăugat
Nu puteți seta obiectul prototip literal dacă moșteniți de la altceva, ceea ce ar suprascrie prototipul anterior
adăugat autor Juan Mendes, sursa
Esti corect - dar in acest caz, "Vector" este un obiect nou, asa ca nu am vazut nici o nevoie sa va ingrijorati de problemele de moștenire
adăugat autor JayTee, sursa

Nu există clase în javascript.

Există însă obiecte. Nu aveți nevoie de o clasă pentru a crea un obiect în javascript. Are funcții de construcție pe care le puteți invoca cu noi, de exemplu:

var james = new Person();

Puteți simula un comportament de tip clasă cu:

exemplu de prototip:

function Car (type) {
    this.type = type;
    this.color = "red";
}

Car.prototype.getInfo = function() {
    return this.color + ' ' + this.type + ' car';
};

obiect exemplu literal

var car = {
    type: "honda",
    color: "red",
    getInfo: function() {
        return this.color + ' ' + this.type + ' car';
    }
}
0
adăugat

Sunt un mare fan al folosirii a bibliotecii lui John Resig pentru aceasta. Ușoare, drepte și deja știți cum să le folosiți dacă sunteți familiarizați cu stilul "obișnuit" orientat spre obiect.

0
adăugat
JavaScript, România - Moldova
JavaScript, România - Moldova
328 participanți

Comunitatea Română JavaScript: github.com/js-ro Pentru confort, opriți notificările. Parteneri: @node_ro, @php_ro, @python_ro, @seo_ro, @RomaniaGroup, @ai_ro, @Grupuri_IT Offtop: @holywars_ro Joburi: @js_jobs_ro Sponsored with ❤️ by ciupacabra.com