Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript node.js中对象的方法和属性之间的差异_Javascript_Node.js_Methods_Prototype_Ecmascript 5 - Fatal编程技术网

Javascript node.js中对象的方法和属性之间的差异

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

我试图理解对象的属性与对象原型上定义的方法之间的关系。下面的代码打印“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没有打印出来,因为它是在文件中第二个定义的。这不应该覆盖现有的方法定义吗


我正在运行node v0.10.21

这与您是否处于节点环境无关。如果未设置属性的特定属性,则默认为
false
。数据属性具有以下属性(括号中的描述用于属性为false时的描述):

  • 可配置
    (不能删除,也不能更改属性或属性类型)
  • 可枚举
    (无法在for-in循环中看到)
  • 可写
    (只读,但仍可删除)
  • (值本身)
由于您在调用
对象.defineProperty
时未指定
可写的
true
,因此它无法写入,因此是只读的()


默认情况下,“标准”属性将所有这些属性(除了
value
)显式设置为
true
(内部),这就是它正常工作的原因。值得注意的是,尝试在ES5严格模式下执行的操作将抛出
TypeError

True。。可能会把它挂起来@conorgil如果在中运行脚本,您将看到
ECMA3
赋值实际上抛出了一个错误。我在严格模式下运行它,它确实出错了。当我将writeable:true添加到Object.defineProperty中的调用时,它就如我最初预期的那样工作了。