5
ECMAScript版本5规范引入了一种称为访问器属性的新属性。与名为数据属性的现有和已知类型的属性相比,这两件事情在规范方面是如何相互关联的?ECMAScript中访问器属性和数据属性之间的区别?
我已经阅读了ECMAScript v5的规格说明,并且我不清楚确切的区别。有人可以用代码示例解释两者吗?我搜索了互联网,但所有的例子都很模糊。
ECMAScript版本5规范引入了一种称为访问器属性的新属性。与名为数据属性的现有和已知类型的属性相比,这两件事情在规范方面是如何相互关联的?ECMAScript中访问器属性和数据属性之间的区别?
我已经阅读了ECMAScript v5的规格说明,并且我不清楚确切的区别。有人可以用代码示例解释两者吗?我搜索了互联网,但所有的例子都很模糊。
命名数据属性将名称与值关联。这意味着您可以使用该属性直接获取和检索数据,如类上的公共字段。
已命名的访问器属性将名称与一个或两个访问器函数关联。 访问器函数用于存储或检索与属性关联的值。这意味着您将访问权限限制在get或/和set访问器属性后面的某个值。
通过比较两者,第一个选项不会对您的值的访问方式进行封装或控制。第二个让你指定你的值可以被读取'get accessor','set accessor'或两者。
UPDATE
关于您的第二个疑问(在评论)这里是我刚刚熟ECMA脚本基础一点点,快101):
// 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是的,我读了ecmascript规范,但我仍然不明白accessor属性如何保存数据,而不具有value属性以及data属性和accessor属性之间的差异。 – ringord
查看https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperty#Description –