2012-04-02 3 views
3

Это вопрос о том, как работают JavaScript-получатели и сеттеры.Использование delete в JavaScript getter/setter для удаления getter/setter

Выполнение Mozilla log4j как модуля JavaScript (частичная реализация, только важные части, необходимые для предполагаемых случаев использования, например, в Firefox Sync) содержит следующее определение getter/setter.

Что делает «удаление» в геттере/сеттере для вас? Что это вообще значит? Кажется, что эффект от первого использования имеет разные результаты от следующих видов использования (но если да, то как)?

get repository() { 
    delete Log4Moz.repository; 
    Log4Moz.repository = new LoggerRepository(); 
    return Log4Moz.repository; 
}, 
set repository(value) { 
    delete Log4Moz.repository; 
    Log4Moz.repository = value; 
}, 

ответ

0

удалить оператор удаляет свойство объекта. если у вас есть объект

o = {a: "hello", b: "world"};

и вы

удаления у.е;

ваш объект будет выглядеть как этот

O = {Ь: "мир"};

и после этого, если вы

у.е = "Foo";

это добавит новое свойство а на объект о и присвоить ему значение «Foo» и ваш объект будет как

о = {а: «Foo», б: «мир»} ;

+1

Будет ли все еще быть геттером (или сеттером) после этого, если бы это началось именно так? Думаю, нет, теперь это будет просто ценность, не так ли? (Как вы можете определить, является ли свойство getter/setter или нет? Есть ли способ проверить/сбросить объект, который говорит, какие свойства являются getters/seters?) –

2

В вопросе (и существующих ответах) отсутствует важный контекст; геттер и сеттер определены в объекте Log4Moz. Имея это в виду, что происходит, когда вызывается геттер или сеттер и удаляет свойство, для которого оно определено?

delete по свойствам доступа (свойства с get/set) имеет тот же эффект, что и на свойствах данных, а именно, что он удаляет свойство. После выполнения delete Log4Moz.repository свойство repository больше не присутствует на объекте Log4Moz, а функции getter/setter больше не привязаны к этому свойству.

Следующие строки, которые присваиваются Log4Moz.repository, ведут себя так, как вы ожидали. Свойство данных создается в объекте Log4Moz с заданным значением.

Фактически, это означает, что это свойство заменяет свойство accessor свойством данных после первого доступа (либо get, либо set), создавая лениво-инициализированное свойство данных.

+0

Отличный ответ. –

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