为了账号安全,请及时绑定邮箱和手机立即绑定

对象里面的属性名为_year,使用defineProperty()方法的时候用的却是“year”,十分疑惑

对象里面的属性名为_year,使用defineProperty()方法的时候用的却是“year”,十分疑惑

小佳佳QAQ 2015-12-17 10:46:24
代码内容出自《JavaScript高级程序设计(第三版)》141页,讲的是面向对象的程序设计
查看完整描述

3 回答

?
小佳佳QAQ

TA贡献8条经验 获得超19个赞

书中有说明的(以下是原文):

访问器属性不包含数据值;它们包含一对儿 getter 和 setter 函数(不过,这两个函数都不是必需的)。

在读取访问器属性时,会调用 getter 函数,这个函数负责返回有效的值;在写入访问器属性时,会调用

setter 函数并传入新值,这个函数负责决定如何处理数据。

访问器属性不包含数据值;它们包含一对儿 getter 和 setter 函数(不过,这两个函数都不是必需的)。

在读取访问器属性时,会调用 getter 函数,这个函数负责返回有效的值;在写入访问器属性时,会调用

setter 函数并传入新值,这个函数负责决定如何处理数据。

访问器属性不能直接定义,必须使用 Object.defineProperty() 来定义。

_year 前面的下划线是一种常用的记号,用于表示只能通过对象方法访问的属性。而访问器属性 year 则包含一个

getter 函数和一个 setter 函数。getter 函数返回 _year 的值,setter 函数通过计算来确定正确的版本。

我的理解:

_year是一个只能通过对象方法访问的内部属性,用于存储对象方法需要用到的值。

而访问器属性year通过Object.defineProperty() 来定义,本身不包含数据值,使用get和set读取和设置对象中的属性值,返回值。(year没有在对象字面量中直接体现)

_year≠year,_year是普通的属性,只是前面添加了"_"表示其不能直接访问;year是访问器属性,本身就没有数值,主要的工作是定义出来操作_year和edition的值,它也可以访问_year并直接返回_year存储的内容,比如它的get方法。

另外,书中的定义多个属性Object.defineProperties()恰好可以解释_year和year是两个不同的属性,书中代码如下:

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

以上代码在 book 对象上定义了两个数据属性( _year 和 edition )和一个访问器属性( year )。

最终的对象与上一节中定义的对象相同。唯一的区别是这里的属性都是在同一时间创建的。

以上内容仅供参考。如有理解错误,请指出,不胜感激!

查看完整回答
1 反对 回复 2016-11-21
  • 叶微白_
    叶微白_
    对的,就是这样,这个例子,是想说明对象内部,当赋值,修改值的时候,会发生~
?
李晓健

TA贡献1036条经验 获得超461个赞

他这个_year 只是在内部用的,其实对外用的是year  他这样做就相当于给 book又添加了一个year属性嘛 只不过你在取year值时,他内部去取的是_year的值,赋值时也是一样,你赋给的是year ,他在内部又把这个值赋给了_year

查看完整回答
反对 回复 2015-12-17
?
慕粉4229183

TA贡献2条经验 获得超1个赞

   123

查看完整回答
反对 回复 2016-11-17
  • 3 回答
  • 0 关注
  • 1877 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信