3 回答
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 )。
最终的对象与上一节中定义的对象相同。唯一的区别是这里的属性都是在同一时间创建的。
以上内容仅供参考。如有理解错误,请指出,不胜感激!
TA贡献1036条经验 获得超461个赞
他这个_year 只是在内部用的,其实对外用的是year 他这样做就相当于给 book又添加了一个year属性嘛 只不过你在取year值时,他内部去取的是_year的值,赋值时也是一样,你赋给的是year ,他在内部又把这个值赋给了_year
添加回答
举报