2013-11-13 4 views
4

Я пытаюсь понять, как свойства объекта относятся к методам, определенным на прототипе объекта. Следующий код печатает «ECMA style 5», в то время как я ожидаю, что он напечатает «ECMA style 3».Разница между методом и свойством объекта в node.js

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

ответ

3

Это не имеет ничего общего с ли вы в Узла среде или нет. Если определенный атрибут свойства не задан, они по умолчанию равны false. Свойства данных имеют следующие атрибуты (описание в скобках, когда атрибут является ложным):

  • configurable (не может быть удален, не могут атрибуты или тип собственности быть изменен)
  • enumerable (нельзя увидеть в для-в цикле)
  • writable (только для чтения, но все еще может быть удален)
  • value (само значение)

Поскольку вы не указали в своем обращении к Object.defineProperty, что writable является true, его нельзя записать и, следовательно, доступно только для чтения (reference).

По умолчанию, «стандартные» свойства имеют все эти атрибуты (кроме value), явно заданные как true (внутренне), поэтому он работает нормально. Хорошая заметка от Mike Edwards заключается в том, что попытка сделать то, что вы делали в строгом режиме ES5, будет бросать TypeError.

+1

True .. возможно, подключите это ... https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperty#Description – PSL

+3

@conorgil Если вы запустите свой скрипт в [строгом режиме] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions_and_function_scope/Strict_mode) вы увидите, что присваивание 'ECMA3' действительно вызывает ошибку. –

+0

Я запускал его в строгом режиме, и это действительно ошибка. Когда я добавил writeable: true для вызова в Object.defineProperty, тогда он работал, как я и ожидал. – conorgil

Смежные вопросы