使用getter和setter与在javascript中定义属性

使用getter和setter与在javascript中定义属性,javascript,Javascript,除了编码风格之外,以下两种方式是否有任何优点/缺点: Circle.prototype = { radius : 10}; Object.defineProperty(Circle.prototype, 'circumference', { get: function() { return 2*Math.PI*this.radius; } }); vs 在属性定义中,JavaScript通过内部方法DefineOwnProperty处理它,其中赋值由内部方法Put处理。简而言之,第二

除了编码风格之外,以下两种方式是否有任何优点/缺点:

Circle.prototype = { radius : 10};
Object.defineProperty(Circle.prototype, 'circumference', {
     get: function() { return 2*Math.PI*this.radius; }
});
vs


在属性定义中,JavaScript通过内部方法
DefineOwnProperty
处理它,其中赋值由内部方法
Put
处理。简而言之,第二种方法检查属性是否为只读,如果是,将导致拒绝。 当使用只读属性时,这可能会产生后果,只读属性会阻止赋值,但不会定义

如果要创建新特性,最好使用定义。如果要更改特性的值,可以使用赋值

请看更多非常有趣的文章

编辑:事实上,
defineProperty
用于定义只读属性等原因,以及定义的属性行为的其他原因。
也请看这里。

第二个功能需要一个不太常见的新语言功能。另外,
.defineProperty()
对属性的可枚举性和可变性有隐式默认值,我认为这与通过新语法得到的不同。MDN文档中有一个有趣的段落(在“删除属性”标题上方)。然而,这只是一种语法上的甜言蜜语,而不是另一种。如果你要发布一个链接(很高兴你引用了这个来源),请首先在你的答案中提供一个概要,并用一个非现场链接来补充这个答案。如果该网页被关闭,并且有人在几天、几个月、几年后访问,则此帖子将毫无用处。指向有趣材料的链接很棒,但关键点应直接复制到此处的答案中。好的,请不要再向下投票,我将更新答案。答案已更新。如果仍然不完整,请告诉我进一步更新。
Circle.prototype = {
  radius : 10,
  get circumference() { return 2*Math.PI*this.radius; }
}