Именованное свойство данных связывает имя со значением. Это означает, что вы используете свойство для получения и получения данных напрямую, например, для открытого поля в классе.
Именованное свойство accessor связывает имя с одной или двумя функциями доступа. Функции доступа используются для хранения или получения значения, связанного с этим свойством. Это означает, что вы ограничиваете доступ к определенному значению за атрибутом get или/и set accessor.
Сравнивая оба варианта, 1-й вариант не дает инкапсуляции или какого-либо контроля, как можно получить доступ к вашему значению. Второй позволяет указать, может ли ваше значение быть прочитано «получить доступ», записать «set accessor» или и то, и другое.
UPDATE
Что касается вашего вторичного сомнения (в комментариях) здесь немного и быстро 101 по основам Ecma сценариев, которые я только что приготовленными;):
// 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);
}
Использовать jsfiddle поиграть!
Счастливое кодирование!
Вы даже пытались прочитать об этом, прежде чем просить кого-нибудь здесь повторить то, что говорит спецификация? – Touffy
@Touffy Да, я читаю спецификацию ecacccript, но я до сих пор не понимаю, как свойство accessor может хранить данные без атрибута value и разницы между свойством data и свойством accessor. – ringord
См. Https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperty#Description –