4

我试图了解对象的属性如何与对象原型上定义的方法相关。以下代码打印“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));

我正在阅读文章1,但我无法理解为什么不打印样式 3,因为它是在文件中定义的第二个。这不应该覆盖现有的方法定义吗?

我正在运行节点 v0.10.21

4

1 回答 1

3

这与您是否在 Node 环境中没有任何关系。如果未设置属性的特定属性,则默认为false. 数据属性具有以下属性(括号中的描述是当属性为假时):

  • configurable(不能删除,也不能更改属性或属性类型)
  • enumerable(在 for-in 循环中看不到)
  • writable(只读但仍可删除)
  • value(价值本身)

因为您没有在调用中指定Object.definePropertyis writabletrue所以它不能被写入,因此是只读的(参考)。

默认情况下,“标准”属性将所有这些属性(除了value)明确设置为true(内部),这就是它正常工作的原因。Mike Edwards的一个很好的说明是,尝试做你在 ES5 严格模式下所做的事情会抛出一个TypeError.

于 2013-11-13T22:49:18.337 回答