2014-11-20 16 views
9

Attualmente sto lavorando a un progetto in cui stiamo scrivendo JavaScript orientato agli oggetti. In questo progetto ho visto due modi diversi di definizione di una classe:Utilizzo del prototipo JavaScript - best practice

1: Dichiarare le funzioni in una sola volta sul prototipo

My.Namespace.ClassName = function(param1, param2) { 
    this.member1 = param1; 
    this.member2 = param2; 
}; 

My.Namespace.ClassName.prototype = { 
    myFunction1: function() { 
     return this.member1 + " " + this.member2; 
    }, 

    myFunction2: function(param1) { 
     this.member3 = paraml; 
    } 
}; 

2: preparare ogni singola funzione sul prototipo

My.Namespace.ClassName = function(param1, param2) { 
    this.member1 = param1; 
    this.member2 = param2; 
}; 

My.Namespace.ClassName.prototype.myFunction1 = function() { 
    return this.member1 + " " + this.member2; 
}; 

My.Namespace.ClassName.prototype.myFunction2 = function(param1) { 
    this.member3 = paraml; 
}; 

C'è qualche differenza nel modo in cui si comporta JavaScript in base ai due esempi forniti o è solo una differenza di stile?

Personalmente non ho notato alcuna differenza di comportamento, ma ho la sensazione che debba esserci una sottile differenza che attualmente mi manca.

Oltre a questo. Vorrei sapere se questa è una pratica comune o ci sono modi migliori per definire le classi.

risposta

8

C'è una sottile differenza. Nel primo metodo, quando si sovrascrive il prototipo, c'era una proprietà che ora è persa. Questo è il constructor, che rimanda alla tua funzione. Il costruttore ti consente di ricreare il tipo di oggetto che è.

si può facilmente tornare indietro e quindi utilizzare il primo metodo impostando manualmente:

My.Namespace.ClassName.prototype = { 
    myFunction1: function() { 
     return this.member1 + " " + this.member2; 
    }, 

    myFunction2: function(param1) { 
     this.member3 = paraml; 
    }, 
    constructor: My.Namespace.ClassName 
}; 

Vedi anche: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/constructor

+0

Può spiegare più in dettaglio cosa si intende con _In il primo metodo, quando sovrascrivi il prototipo, c'era una proprietà là che ora è persa_. Vuoi dire che c'è una differenza nel 'My.Namespace.ClassName.constructor' prima e dopo aver chiamato' var obj = new My.Namespace.ClassName ("value1", "value2") '? – hwcverwe

+0

No - 'My.Namespace.ClassName.prototype' viene fornito con una proprietà' constructor'. Quando si sovrascrive il prototipo, il costruttore viene perso. – Scimonster

+0

Accettato ma una domanda però: Posso combinare entrambi gli stili o causerà qualche problema? – hwcverwe