2009-11-17 10 views

risposta

2

C'è una differenza almeno se si assegna un oggetto non primitivo a this.somevar o prototype.somevar.

Provare a eseguire questo:

function Agent(bIsSecret) 
{ 
    if(bIsSecret) 
     this.isSecret=true; 

    this.isActive = true; 
    this.isMale = false; 
    this.myArray = new Array(1,2,3); 
} 

function Agent2(bIsSecret) 
{ 
    if(bIsSecret) 
     this.isSecret = true; 
} 

Agent2.prototype.isActive = true;  
Agent2.prototype.isMale = true; 
Agent2.prototype.myArray = new Array(1,2,3); 

var agent_a = new Agent(); 
var agent_b = new Agent(); 

var agent2_a = new Agent2(); 
var agent2_b = new Agent2(); 

if (agent_a.myArray == agent_b.myArray) 
    alert('agent_a.myArray == agent_b.myArray'); 
else 
    alert('agent_a.myArray != agent_b.myArray'); 

if (agent2_a.myArray == agent2_b.myArray) 
    alert('agent2_a.myArray == agent2_b.myArray'); 
else 
    alert('agent2_a.myArray != agent2_b.myArray'); 
+0

ho provato: agent_a.myArray = agent_b.myArray' agent2_a.myArray == agent2_b.myArray Quindi, si vede che al utilizzando "questo! "ogni oggetto ha una sua proprietà, funzione. Ma quando uso il prototipo, è condiviso. Quale può essere un problema perché quando cambio la matrice su un oggetto, è cambiato su tutti gli altri. :( – pencilCake

+0

yup, qualcosa del genere;) – Lukman

1

n 'prototipo' utilizzato per l'attuazione di successione in Javascript. Come ad esempio che:

/** obsolete syntax **/ 

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

var guy = new Person('Miro'); 
guy.say('hi'); 
// -> "Miro: hi" 

var Pirate = Class.create(); 
// inherit from Person class: 
Pirate.prototype = Object.extend(new Person(), { 
    // redefine the speak method 
    say: function(message) { 
    return this.name + ': ' + message + ', yarr!'; 
    } 
}); 

var john = new Pirate('Long John'); 
john.say('ahoy matey'); 
// -> "Long John: ahoy matey, yarr!" 

codice sorgente e informazioni aggiuntive si possono trovare qui: http://www.prototypejs.org/learn/class-inheritance

0

punto di vista funzionale, questo è lo stesso. Quest'ultimo, tuttavia, sottolinea le somiglianze tra gli oggetti Agent. Puoi vedere in un attimo che questi membri hanno quel valore, mentre in una funzione di costruzione più complicata, con molti condizionali, è più difficile.

Consente inoltre al runtime javascript di scegliere come gestire le inizializzazioni dei membri Agent. (eseguire alcune operazioni preliminari, ...)

0

Supponendo che questa funzione venga utilizzata come costruttore, la prima con le proprietà dell'insieme sulla nuova istanza e la seconda sul prototipo. Se sono indipendenti dall'istanza, i due snippet sono equivalenti, ma se non lo sono (come suggerisce il loro nome), allora non lo sono.

Problemi correlati