Говоря о маркерах функций в JS, я всегда чувствую, что это немного странно. Почему вы говорите об этом атрибуте? Это возникло из вопроса о проблеме. Мы все знаем, что у окна объект на самом деле
Поскольку экземпляр окна браузера является экземпляром, этот экземпляр должен иметь «свойства» и «методы», например, следующее:
Когда мы используем функции, мы определяем некоторые свойства, такие как имя, возраст и т. Д., И мы также можем удалять, устанавливать и обновлять операции на них.
Тогда следующий вопрос. Поскольку название объекта моего личности может быть изменено динамически, согласно этому принципу, я также должен иметь возможность изменить неопределенное значение под окном, и тогда я очень заинтересован в том, чтобы взглянуть.
Результат все еще дается. Я не успешно изменил неопределенное значение, так почему это происходит? Там нет причин. Это не тип упаковки, упомянутый в предыдущей статье, но мы должны уважать результат. Это показывает, что базовый JS должен был сделать что -то, чтобы вызвать такой результат. На самом деле, в базовом JS записи, который можно записать, false Flag используется по умолчанию, чтобы сделать неопределенный атрибут неписаным. Давайте подробно рассмотрим это ниже.
1: [Задачаемой] функция
Когда дело доходит до того, является ли атрибут, который можно записать, вы можете подумать о доступе GET/SET в C# или ключевом словах READONLY. Ниже вы определенно будете заинтересованы в том, как я должен выполнять работу атрибута только для чтения. В JS вам просто нужно использовать метод DefineProperty.
Из приведенного выше примера вы можете увидеть три забавных вещах:
<1>: Я использовал метод DefineProperty, чтобы превратить человека. Кто -то хочет сказать, что это, очевидно, метод, но как это может быть функцией? На мой взгляд, эта особенность
Режим [xxx], так что это разница между JS. В конце концов, JS не имеет синтаксического сахара, поэтому характеристики определения могут быть определены только с помощью базового общественного метода, то есть DefineProperty.
<2>: я не только вижу в методе, но и настраиваемой. Так для чего это? На самом деле, это основная конфигурация, сообщающая двигателю JS, может ли он удалять и обновить атрибуты. Когда я устанавливаю настраиваемую в False, вы не можете удалить P.Name, потому что это будет неверная операция.
Прочитав их, я думаю, что вы должны понять, почему Undifined не может удалить или обновить. Все они сделаны из странных отметок, как вы думаете, это очень интересно?
<3>: Следующий вопрос, о котором стоит задуматься, это то, как это делает двигатель JS. Существует также атрибут в C#, и этот атрибут будет записан в метаданных после составления компилятора. Затем вы можете использовать отражение, чтобы получить любое значение в вашем атрибуте. Например, сериализуемый класс сериализации, который сообщает SerializableFormat, как отражать и читать класс, которые могут быть сериализованы поля, и который не может, и вам необходимо использовать несериализованные теги.
Кода -копия выглядит следующим образом:
[Сериализуем]
Общедоступный тест
{
[НЕСЕРИАЛИЗАЦИЯ]
Общественное название строки;
}
Из фигуры мы видим, что название нецерировано в IL. Мы знаем, что в JS нет отражения, поэтому прорыв естественно в методе DefineProperty. К сожалению, мы не можем видеть, на что похож базовый исходный код этого метода, поэтому мы не знаем, что он делает с полем «Имя», чтобы динамически делает его неразборчивым. Мы можем только догадаться, какое поведение, которое может возникнуть в двигателе JS, на основе нашего понимания.