2015-04-12 55 views
5

ECMAScript版本5规范引入了一种称为访问器属性的新属性。与名为数据属性的现有和已知类型的属性相比,这两件事情在规范方面是如何相互关联的?ECMAScript中访问器属性和数据属性之间的区别?

我已经阅读了ECMAScript v5的规格说明,并且我不清楚确切的区别。有人可以用代码示例解释两者吗?我搜索了互联网,但所有的例子都很模糊。

+2

在问别人重复规范说什么之前,你甚至还试过了解它吗? – Touffy

+0

@Touffy是的,我读了ecmascript规范,但我仍然不明白accessor属性如何保存数据,而不具有value属性以及data属性和accessor属性之间的差异。 – ringord

+0

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

回答

8

命名数据属性将名称与值关联。这意味着您可以使用该属性直接获取和检索数据,如类上的公共字段。

已命名的访问器属性将名称与一个或两个访问器函数关联。 访问器函数用于存储或检索与属性关联的值。这意味着您将访问权限限制在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玩耍!

快乐编码!

相关问题