我试图了解对象的属性如何与对象原型(prototype)上定义的方法相关联。以下代码打印“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,因为它在文件中被定义为第二个。这不应该覆盖现有的方法定义吗?
我正在运行 Node v0.10.21
最佳答案
这个和你是不是在Node环境下没有任何关系。如果未设置属性的特定属性,则它们默认为 false
。数据属性有以下属性(括号内为属性为false时的说明):
可配置
(不能删除,也不能更改属性或属性类型)可枚举
(不能在for-in循环中看到)可写
(只读但仍可删除)value
(值本身)
因为您没有在对 Object.defineProperty
的调用中指定 writable
是 true
,所以它不能被写入,因此是只读 ( reference )。
默认情况下,“标准”属性将所有这些属性(value
除外)显式设置为 true
(内部),这就是它正常工作的原因。 Mike Edwards 的好笔记是尝试做你在 ES5 严格模式下所做的事情会抛出一个 TypeError
。
关于javascript - node.js 中对象的方法和属性之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19966019/