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.definePropertytrue ,所以无法写入,因此属于只读( 引用 )。

默认情况下,“标准”属性将所有这些属性(除了value )都显式设置为true (内部),这就是为什么它可以正常工作。 Mike Edwards的一个好消息是,试图在ES5严格模式下执行你正在做的事情将会抛出一个TypeError