2015-04-12 29 views
5

ECMAScript sürüm 5 belirtimi, erişim özellikleri adı verilen yeni bir özellik türü sunar. Veri özellikleri olarak adlandırılan mevcut ve bilinen özellik tipi ile karşılaştırıldığında, bu iki şey, yalnızca belirtim açısından birbiriyle nasıl ilişkilidir?ECMAScript'te accessor özelliği ile data özelliği arasındaki fark nedir?

ECMAScript v5 ile ilgili özellikleri okudum ve tam olarak bana göre net değil. Birisi iki kod örneği ile açıklayabilir mi? İnterneti araştırdım ama tüm örnekler belirsiz görünüyor.

+2

Birinin burada söylediklerinin ne söylediğini tekrar etmesini istemeden önce bunu okumaya çalıştınız mı? – Touffy

+0

@Touffy Evet ecmascript spesifikasyonunu okudum, ancak hala accessor özelliğinin value niteliğine ve data özelliği ile accessor özelliği arasındaki farka sahip olmadan verileri nasıl tutabileceğini anlamıyorum. – ringord

+0

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

cevap

8

Adlandırılmış veri özelliği, bir adı bir değerle ilişkilendirir. Bu, bir sınıftaki genel alan gibi doğrudan veri almak ve almak için mülkü kullandığınız anlamına gelir.

Adlandırılmış erişim özelliği, bir veya iki erişim işlevi olan bir adı ilişkilendirir. Erişim işlevi, özellik ile ilişkili bir değeri depolamak veya almak için kullanılır. Bunun anlamı, get ve/veya set accessor özelliğinin arkasındaki belirli bir değere erişimi kısıtlamanızdır.

Her ikisini de karşılaştırarak, 1. seçenek, değerinize nasıl erişileceği konusunda size herhangi bir kapsülleme veya denetim türü sunmaz. 2nd, değerinizin 'accessor ver', 'set accessor' yazan ya da her ikisini de okuyabildiğini belirtebilmenizi sağlar.

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

benim jsfiddle kullanın:);

(yorumlarda) ikincil şüphe İlişkin GÜNCELLEME

burada ben sadece pişmiş ettik ECMA dizesi temelleri üzerinde biraz ve hızlı 101 etrafında oynamak için!

Mutlu Kodlama!

İlgili konular