Object.defineProperty (obj, "prop", desc) ведет себя странно - PullRequest
1 голос
/ 19 июня 2011

Если я определяю объект и устанавливаю его настраиваемое свойство равным false, но оставляю все остальные реквизиты в покое, а затем пытаюсь установить для свойства записи этого объекта значение false, тогда возвращается значение true, выдается ошибка TypeError.

Вот пример того, как я это делаю, хотя я пытался это сделать, изменив только один дескриптор данных объекта в точечной нотации, а также изменив все дескрипторы данных объекта в литерале объекта, и ни одна форма не сработала.

// simple object, and the data descriptor
var o = {name : "tom"},
    dataDesc = Object.getOwnPropertyDescriptor(o, "name");

noConfig();
alert(dataDesc.writable);  // alerts true

readOnly();
alert (dataDesc.writable); // alerts false

writable();
alert (dataDesc.writable); // error is thrown within writable() - alerts true

// early in the script, altering only configurable property
function noConfig(){
  dataDesc.configurable = false;
}

// later in the script, altering only writable property
function readOnly(){

  dataDesc.writable = false; // configurable = false; writable = false;
  Object.defineProperty(o, "name", dataDesc); // works finely
}

function writable(){
    try{
      dataDesc.writable = true; // configurable = false; writable = true;
      Object.defineProperty(o, "name", dataDesc); // throws TypeError
    }catch(e){
      alert(e); // alerts: "TypeError: Cannot redefine property: defineProperty"
    }
}

Я не смог найти ничего, что могло бы помочь в спецификации, но в статье MDC для defineProperty говорится, что даже после того, как свойство объекта становится неконфигурируемым, дескриптор данных для записи все еще может быть изменен.Все остальные не могут, но могут писать.

Итак, это что-то в Chrome, или я делаю это неправильно?

/ * ОБНОВЛЕНИЕ * /

Это было решено- просто прочитайте спецификацию 8.12.9, раздел 10.ai

1 Ответ

2 голосов
/ 19 июня 2011

Ошибка не из dataDesc.writable = true;, а из Object.defineProperty(o, "name", dataDesc); ..., что правильно, поскольку {name : "tom"} имеет уже определенное свойство name.

Это правильное поведение, вы можете изменить writable, а не можете переопределить свойство name.

Я думаю, что путаница вызвана поведением, вам не нужно звонить .defineProperty(), чтобы .writable вступил в силу, вы можете проверить это здесь .

Примечание: Я закомментировал .configurable = false в приведенном выше примере, который блокировал бы атрибуты свойства и не позволял бы вам изменять writable, оставляя его застрявшим в false в исходном коде .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...