Jascript 高级编程ch06 中的面向对象一段代码,没有得出想象中的结果

胖子吴 2017-09-30 12:38:47

<!DOCTYPE html>
<html>
<head>
<title>Multiple Properties Example</title>
<script type="text/javascript">

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 = 2005;
console.dir(book);
alert(book.edition); //2

</script>
</head>
<body>
<p>Note: this example only works in browsers that have implemented the ECMAScript 5 <code>Object.defineProperty()</code> method (IE9 and Firefox 4).</p>
</body>
</html>


得到的: 1
问题1:书上写的应该是2 ,set 调用了,但是 this._year 没有赋值。
问题2:还有为什么year 要加_,那什么时候应该加,什么不需要加。
谢谢
...全文
412 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
Helen_fight 2017-09-30
  • 打赏
  • 举报
回复
哦 明白了,二楼回答了,没注意看
Helen_fight 2017-09-30
  • 打赏
  • 举报
回复
还是不明白,为什么Obj.defineproperty写的_year,edition这些属性没有改变。而这样写却变了

var book = {
	_year:2004,
	edition:1,
	get year(){
		return this._year;
	},
	set year(newval){
		this._year = newval;
		this.edition += newval-2004;
    }
}
book.year = 2005;
alert(book.edition)
胖子吴 2017-09-30
  • 打赏
  • 举报
回复
谢谢,楼上的两位已经解答了我两个问题。 看完这章,总体感觉Js 面向对象很糟糕,实际项目敢不敢用,还两说。
x80819091 2017-09-30
  • 打赏
  • 举报
回复
引用 3 楼 wusanpang_2016 的回复:
谢谢,楼上的两位已经解答了我两个问题。 看完这章,总体感觉Js 面向对象很糟糕,实际项目敢不敢用,还两说。
你现在的用法并不算一般意义上的oop(面向对象),一般是先定义类,然后在prototype上加属性和方法,不过从es6之后,加了一个class的语法糖,oop好写太多了,个人感觉手感比java, c#还要好。。
x80819091 2017-09-30
  • 打赏
  • 举报
回复
帮你改成了es6,我结果是2

const book = {
  _year: 2004,
  edition: 1,
  get year() {
    return this._year
  },
  set year(newValue) {
    if (newValue > 2004) {
      this._year = newValue
      this.edition += newValue - 2004
    }
  }
}

book.year = 2005
alert(book.edition) //2
_前缀一般是私有字段算是命名规范吧
functionsub 2017-09-30
  • 打赏
  • 举报
回复
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperties
        var book = {};
         
        Object.defineProperties(book, {
            _year: {
                value: 2004,
                writable: true // 默认false
            },
             
            edition: {
                value: 1,
                writable: true // 默认false
            },
             
            year: {            
                get: function(){
                    return this._year;
                },
                 
                set: function(newValue){
                    if (newValue > 2004) {
                        this._year = newValue;
                        this.edition += newValue - 2004;
                    }                  
                }            
            }        
        });
            
        book.year = 2005;
        console.dir(book);
        alert(book.edition);   //2
可能是教材比较老了吧。

87,994

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 JavaScript
社区管理员
  • JavaScript
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧