2015-04-12 11 views
5

La specifica della versione 5 di ECMAScript, introduce un nuovo tipo di proprietà denominate proprietà di accesso. Rispetto al tipo di proprietà esistente e noto chiamato proprietà dei dati, in che modo queste due cose sono correlate tra loro, solo in termini di specifiche?Differenza tra proprietà accessoria e proprietà dati in ECMAScript?

Ho letto le specifiche su ECMAScript v5 e non mi è chiara la differenza esatta. Qualcuno può spiegare i due con un esempio di codice? Ho cercato su internet, ma tutti gli esempi sembrano vaghi.

+2

Hai mai provato a leggerlo prima di chiedere a qualcuno qui di ripetere ciò che dice la specifica? – Touffy

+0

@Touffy Sì, ho letto le specifiche ecmascript, ma continuo a non capire in che modo la proprietà accessor può contenere dati senza avere attributo valore e la differenza tra proprietà dati e proprietà accessoria. – ringord

+0

Vedere https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperty#Description –

risposta

8

Una proprietà dati denominata associa un nome a un valore. Il che significa che usi la proprietà per ottenere e recuperare i dati direttamente, come un campo pubblico in una classe.

Una proprietà di accesso denominata associa un nome con una o due funzioni di accesso. Le funzioni di accesso sono utilizzate per memorizzare o recuperare un valore associato alla proprietà. Ciò significa che si limita l'accesso a un determinato valore dietro a get o/e imposta la proprietà accessor.

Confrontando entrambi, la prima opzione non fornisce alcun incapsulamento o tipo di controllo, su come si accede al proprio valore. Il secondo consente di specificare se il valore può essere letto 'get accessor', scritto 'set accessor' o entrambi.

UPDATE

Per quanto riguarda il tuo dubbio secondaria (nei commenti) ecco un po 'e rapido 101 sulle basi Ecma Script che ho appena cotti;):

// accounting namespace 
var Accounting = {}; 

// client class definition 
Accounting.Client = function(){ 
    // private fields 
    var _address=""; 
    var _phone=0; 

    // data property 
    this.token = ""; 

    // privileged properties 
    Object.defineProperty(this, "address", { 
     get: function(){ 
      if(console) console.log('hey im using get address accessor property.');   
      return _address; 
     }, 
     set: function(value){ 
      if(console) console.log('hey im using set address accessor property.'); 

      if(value == null) 
       throw new Error('Field address cannot be null!'); 

      _address=value; 
     } 
    }); 

    Object.defineProperty(this, "phone", { 
     get: function(){ 
      if(console) console.log('hey im using get phone accessor property.'); 
      return _phone; 
     }, 
     set: function(value){ 
      if(console) console.log('hey im using set phone accessor property.'); 
      _phone=value; 
     } 
    }); 
}; 

Accounting.Client.prototype = { 
    sayHello: function(){ 
     alert("hello im a shared function, which means im shared by all objects of type Client" 
       + " and i do not have access to private fields :(."); 
    } 
}; 


/* use case */ 
var c1 = new Accounting.Client(); 
c1.address = "Rua da Capela"; 
c1.phone = 961909090; 
c1["token"] = "mytoken in a data property"; 
c1.token = c1.token + "-111"; 

alert("client address is '" + c1.address + "' and his phone also is '" + c1.phone + "'."); 
c1.sayHello();  
alert(c1.token); 

try{ 
    // check non nullable field. 
    c1.address=null; 
} 
catch(ex){ 
    alert(ex); 
} 

Usa mia jsfiddle giocare!

Happy Coding!

Problemi correlati