2015-04-12 14 views
5

Specyfikacja ECMAScript w wersji 5 wprowadza nowy typ właściwości o nazwie właściwości akcesora. W porównaniu z istniejącymi i znanymi typami właściwości zwanymi właściwościami danych, jak te dwie rzeczy są ze sobą powiązane, tylko pod względem specyfikacji?Różnica między właściwościami akcesor i właściwością danych w ECMAScript?

Znam specyfikację ECMAScript v5 i nie jest dla mnie jasne, jaka jest różnica. Czy ktoś może wyjaśnić te dwa przykładem kodu? Przeszukałem Internet, ale wszystkie przykłady wydają się niejasne.

+2

Czy próbowałeś nawet przeczytać o tym, zanim poprosisz kogoś o powtórzenie tego, co mówi spec? – Touffy

+0

@ Touffy Tak, czytam specyfikację ecmascript, ale nadal nie rozumiem, w jaki sposób właściwość accessor może przechowywać dane bez wartości atrybutu i różnicy między właściwością danych a właściwością akcesora. – ringord

+0

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

Odpowiedz

8

Właściwość nazwanych danych wiąże nazwę z wartością. Co oznacza, że ​​używasz tej właściwości, aby pobierać i pobierać dane bezpośrednio, na przykład z pola publicznego w klasie.

Nazwana właściwość accessor kojarzy nazwę z jedną lub dwiema funkcjami akcesora. Funkcje akcesora służą do zapisywania lub pobierania wartości powiązanej z właściwością. Co oznacza, że ​​ograniczasz dostęp do określonej wartości za właściwością get lub/i set accessor.

Porównywanie obu opcji 1. nie zapewnia hermetyzacji ani rodzaju kontroli, w jaki sposób uzyskuje się dostęp do wartości. Drugi pozwala ci określić, czy twoja wartość może być odczytana jako "uzyskaj dostęp", napisany "zestaw accessor" lub oba.

UPDATE

Odnośnie swojej wtórnym wątpliwości (w komentarzach) tutaj jest trochę i szybkie 101 na podstawach ECMA Script że ja właśnie gotowane;):

// 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); 
} 

Użyj mojego jsfiddle bawić się!

Happy Coding!

Powiązane problemy