Если я определяю объект и устанавливаю его настраиваемое свойство равным 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