Javascript node.js中对象的方法和属性之间的差异
我试图理解对象的属性与对象原型上定义的方法之间的关系。下面的代码打印“ECMA样式5”,而我希望它打印“ECMA样式3”Javascript node.js中对象的方法和属性之间的差异,javascript,node.js,methods,prototype,ecmascript-5,Javascript,Node.js,Methods,Prototype,Ecmascript 5,我试图理解对象的属性与对象原型上定义的方法之间的关系。下面的代码打印“ECMA样式5”,而我希望它打印“ECMA样式3” var util = require('util'); function MyError() { } util.inherits(MyError, Error); Object.defineProperty(MyError.prototype, 'toJSON', { enumerable: false, value: function () { retu
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没有打印出来,因为它是在文件中第二个定义的。这不应该覆盖现有的方法定义吗
我正在运行node v0.10.21这与您是否处于节点环境无关。如果未设置属性的特定属性,则默认为
false
。数据属性具有以下属性(括号中的描述用于属性为false时的描述):
(不能删除,也不能更改属性或属性类型)可配置
(无法在for-in循环中看到)可枚举
(只读,但仍可删除)可写
(值本身)值
对象.defineProperty
时未指定可写的为true
,因此它无法写入,因此是只读的()
默认情况下,“标准”属性将所有这些属性(除了value
)显式设置为true
(内部),这就是它正常工作的原因。值得注意的是,尝试在ES5严格模式下执行的操作将抛出TypeError
True。。可能会把它挂起来@conorgil如果在中运行脚本,您将看到ECMA3
赋值实际上抛出了一个错误。我在严格模式下运行它,它确实出错了。当我将writeable:true添加到Object.defineProperty中的调用时,它就如我最初预期的那样工作了。