登录

javascript - JS对象访问器属性和数据属性

var book={
    };
    Object.defineProperties(book,{
        _years:{
            value:2014,
        },
        edition:{
            value:1
        },
        year:{
            get:function(){
                return this._years;
            },
            set:function(newValue){
                if(newValue>2004){
                    this_years=newValue;
                    this.edition+=newValue-2004;
                }
            }
        }

    });
var  descriptor1=Object.getOwnPropertyDescriptor(book,'_years');
var  descriptor2=Object.getOwnPropertyDescriptor(book,'year');
alert(descriptor1.writable);//false
alert(descriptor2.writable);//undefined

EAMAScript 5 定义了描述这些属性特征的各类特性,包括数据属性和访问器属性。
数据属性:该属性包含了一个数据值的位置,它包含了4个描述行为的特性:

  1. [[Configurable]]:表示是否能通过delete删除属性从而重新定义属性,能否修改属性的特性,能否把属性修改为访问器属性。

  2. [[Enumerable]]:表示能否用for-in循环返回。

  3. [[writable]]:表示能否修改属性的值。

  4. [[Value]]:包含这个属性的数据值。读取属性值的时候从这个位置读,写入属性值的时候更新到这个位置,默认值为undefined。

访问器属性:包含getter和setter函数。读取访问器属性时,调用getter函数,返回有效的值;在写入访问器属性时,调用setter函数传入新值。它包含了4个特性:

  1. [[Configurable]]:表示是否能通过delete删除属性从而重新定义属性,能否修改属性的特性,能否把属性修改为访问器属性。

  2. [[Enumerable]]:表示能否用for-in循环返回。

  3. [[Get]]:读取属性时调用的函数,默认undefined。

  4. [[Set]]:写入属性时调用的函数,默认undefined。

问题描述:
1.怎样区分哪个属性是访问其属性,哪个是数据属性?是通过下划线标识吗?或者说是具有setter或getter特性的属性?
2._year和year是同一个属性吗?
3.对于属性前面的下划线表示只能通过对象方法访问的属性这句话不是很理解呢,为什么需要用下划线来标识呢

# JavaScript
高洛峰高洛峰2146 天前411 次浏览

全部回复(2) 我要回复

  • 天蓬老师

    天蓬老师2017-04-11 12:17:51

    1. 数据属性和访问器属性一般是通过属性特征描述的不同来区分的,一般来说具有 getter setter 的就是访问器属性。

    2. _year 和 year 并不是同一个属性

    3. 命名中的下划线只是个人习惯或部分约定俗成,如一般以下划线开头的属性不作为公开属性,但其本质上与普通属性没有区别。

    回复
    0
  • 迷茫

    迷茫2017-04-11 12:17:51

    1. 这俩的区别你不是已经给出来了吗……

    2. 不是

    3. 没看懂你这话啥意思……
      对于属性前面的下划线表示只能通过对象方法访问的属性这句话不是很理解这句话在你的文章中出现过吗?我咋没看到。

    回复
    0
  • 取消回复发送