【问题标题】:Difference between accessor property and data property in ECMAScript?ECMAScript 中访问器属性和数据属性之间的区别?
【发布时间】:2015-04-12 17:05:23
【问题描述】:

ECMAScript 版本 5 规范引入了一种称为访问器属性的新型属性。与称为数据属性的现有已知类型的属性相比,仅就规范而言,这两个事物如何相互关联?

我已阅读 ECMAScript v5 的规范,但我不清楚确切的区别。有人可以用代码示例解释这两者吗?我搜索了互联网,但所有示例似乎都含糊不清。

【问题讨论】:

  • 在请某人重复规范中的内容之前,您是否尝试过阅读它?
  • @Touffy 是的,我阅读了 ecmascript 规范,但我仍然不明白访问器属性如何在没有值属性的情况下保存数据以及数据属性和访问器属性之间的区别。
  • 这就是重点:它不保存任何数据,而是定义了您访问该属性时的行为。尝试使用和玩示例以更好地理解。

标签: javascript ecmascript-5 accessor


【解决方案1】:

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

命名访问器属性将名称与一个或两个访问器函数相关联。 访问器函数用于存储或检索与属性关联的值。这意味着您将访问限制在 get 或/和 set 访问器属性后面的某个值。

比较两者,第一个选项没有封装或控制您的值的访问方式。第二个允许您指定您的值是否可以读取“get accessor”、写入“set accessor”或两者兼而有之。

更新

关于您的第二个疑问(在 cmets 中),这里有一个关于我刚刚烹制的 Ecma Script 基础知识的快速 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 玩吧!

编码愉快!

【讨论】:

    猜你喜欢
    • 2023-03-17
    • 2011-05-31
    • 2012-10-03
    • 2010-11-21
    • 2023-03-26
    • 1970-01-01
    • 2018-11-17
    • 2019-06-13
    • 1970-01-01
    相关资源
    最近更新 更多