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!
Birinin burada söylediklerinin ne söylediğini tekrar etmesini istemeden önce bunu okumaya çalıştınız mı? – Touffy
@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
Bkz. Https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperty#Description –