node.js中对象的方法和属性之间的区别
我想了解对象的属性如何与对象的原型上定义的方法相关联。 下面的代码打印“ECMA样式5”,而我期望它打印“ECMA样式3”。
var util = require('util'); function MyError() { } util.inherits(MyError, Error); Object.defineProperty(MyError.prototype, 'toJSON', { enumerable: false, value: function () { return 'ECMA5 style'; } }); MyError.prototype.toJSON = function() { return 'ECMA3 style'; } var x = new MyError(); console.log(JSON.stringify(x));
我正在阅读一篇文章,但是我无法理解为什么样式3没有打印,因为它在文件中被定义为第二个。 不应该重写现有的方法定义吗?
我正在运行节点v0.10.21
这与你是否在Node环境中没有任何关系。 如果属性的特定属性未设置,则默认为false
。 数据属性具有以下属性(括号中的描述用于属性为false时):
-
configurable
(不能被删除,也不能改变属性或types的属性) -
enumerable
(不能在for-in循环中看到) -
writable
(只读,但仍可以删除) -
value
(价值本身)
因为您在调用Object.defineProperty
没有指定writable
Object.defineProperty
为true
,所以无法写入,因此属于只读( 引用 )。
默认情况下,“标准”属性将所有这些属性(除了value
)都显式设置为true
(内部),这就是为什么它可以正常工作。 Mike Edwards的一个好消息是,试图在ES5严格模式下执行你正在做的事情将会抛出一个TypeError
。