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

查看:151
本文介绍了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.对于属性前面的下划线表示只能通过对象方法访问的属性这句话不是很理解呢,为什么需要用下划线来标识呢

解决方案

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

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

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

这篇关于javascript - JS对象访问器属性和数据属性的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆