【问题标题】:Difference between method and property on an object in node.jsnode.js中对象的方法和属性之间的区别
【发布时间】:2013-11-13 22:43:33
【问题描述】:

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

【问题讨论】:

    标签: javascript node.js methods prototype ecmascript-5


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 真的.. 可能把这个联系起来了...developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
    • @conorgil 如果您在strict mode 中运行脚本,您会看到ECMA3 赋值实际上引发了错误。
    • 我在严格模式下运行它确实出错了。当我将 writeable:true 添加到 Object.defineProperty 中的调用时,它按我最初的预期工作。
    猜你喜欢
    • 1970-01-01
    • 2011-02-02
    • 1970-01-01
    • 2014-06-28
    • 1970-01-01
    • 2019-05-26
    • 1970-01-01
    • 2011-05-31
    • 2012-01-12
    相关资源
    最近更新 更多