Введение в Ecmascript5
Прежде всего, мы должны выяснить, что Ecmascript-это бог-ма. Мы знаем, что JavaScript или Livescript был первоначально создан Netscape, а затем Microsoft также последовала за созданием JScript. Scriptease также имеет свой собственный cenvi. Таким образом, есть три версии сценария браузера, которые делают свои собственные. Все понимают это хаотично, поэтому проблема стандартизации ставится в повестку дня. В 1997 году предложение, основанное на JavaScript1.1, было представлено Европейской ассоциации производителей компьютеров (европейские компьютерные производители сектора). Наконец, все разработали ECMA-262, новый стандарт языка сценариев под названием ECMASCRICE. В следующем году ISO/IEC (Международная организация по стандартизации и Международной электротехнической комиссии) также приняла ECMASCRICT в качестве стандарта. После этого мир будет мирным. Основные производители браузеров используют Ecmascript в качестве основы для их соответствующей реализации JavaScript. Конечно, это просто фундамент, и его не было полностью следовали. В противном случае у нас не было бы так много проблем совместимости браузера.
Что такое ecmascript5? Как следует из названия, это пятая версия этой странной вещи, точно так же, как iPhone 5. Ecmascript3, которую мы часто используем сейчас, считается реальным языком программирования, а не игрушкой и стал очень популярным.
текст:
У меня всегда было неправильное понимание GET/SET, и я думаю, что GET SET - это метод атрибута объекта. У меня также было много вопросов после прочтения блогов других людей. Сегодня система провела много тестов и, наконец, выяснила это. (Если вы передаете демонстрационные тесты для чтения и написания, если есть что -то неверное, вы можете критиковать и исправить меня)
Доход Get/Set - это не свойство объекта, а свойство свойства. Каждый должен четко различать. Функции используются только внутри, поэтому к ним нельзя обратиться непосредственно в JavaScript. Чтобы указать, что характеристики являются внутренними значениями, заключаются в скобках между двумя командами, такими как [[значение]].
1. Позвольте мне кратко представить эти характеристики атрибутов (вот простое одобрение)
(1) Атрибут данных - позиция, содержащая значение данных. Эта позиция может читать и записывать значения.
Атрибуты данных имеют четыре характеристики, которые описывают их поведение:
[[Настраивается]]: это настраивается?
[[Перечисляется]]: это перечисляется?
[[[Записывается]]: это читабельно
[[Значение]]: значение атрибута
(2) Атрибут атрибута доклада - не содержит значений данных, содержит функцию Getter и Setter (эти две функции не требуются)
Свойства доклада также имеют четыре характеристики, которые описывают их поведение:
[[Настраивается]]: это настраивается?
[[Перечисляется]]: это перечисляется?
[[Get]]: функция, вызванная при чтении атрибутов, по умолчанию не определена
[[Set]]: функция, вызванная при написании атрибутов, по умолчанию не определена
2. Здесь мы фокусируемся на представлении [[get]]/[[set]] - это то, что мы называем get/set Accessor
Давайте сначала поговорим о поведенческих характеристиках доступа GET/SET, упомянутого в книге: Доставка GET/SET может быть прочитано и написано без определения. Вы также можете определить только один. Если только GET определяется, описанные атрибуты могут быть только читаемыми, а не записываемыми. Если определено только набор, описанные атрибуты могут быть записаны и не читаются.
(1) Наш оригинальный метод GET SET выглядит следующим образом:
function foo (val) {var value = val; this.getValue = function () {return value;}; this.setValue = function (val) {value = val;};} var obj = new foo ("hello"); alert (obj.getvalue ()); // "hello" obj.setvalue (hi ");Приведенный выше код - это просто метод GET SET, реализованный с использованием области закрытия. Обратите внимание, что метод является методом атрибута объекта экземпляра, а не свойством атрибута. Если не определено, значение значения не будет доступно
function foo (val) {var value = val;/* this.getValue = function () {return value;}; this.setValue = function (val) {value = val;};*/} var obj = new foo ("hello"); alert (obj.value); // не определенноеСледующими примерами также являются методы атрибутов объектов, а не свойства атрибутов.
var obj = {name: "John", get: function () {return this.age;} // только get определяется, установлен не определен, но он все еще может читать, записать и атрибуты имени, даже если это возраст //, определенный здесь метод, не повлияет на получение, устанавливает атрибуты атрибутов. Просто обычный атрибут объекта}; alert (obj.name); // Джон читаемый obj.name = "jack"; // writeable alert (obj.name); // Джек(2) Получить/установить аксессуар в качестве свойства атрибута доклада.
Опять же, это не атрибут объекта, они решают, можно ли читать атрибут и записан. Если не установлено, это нормально, как нормально чтение и написание (свойства можно прочитать или прочитать
Напишите, читать и написать доступ к самому свойству)
Есть два способа изменить атрибут get /set:
а Используйте object.defineproperty ()
var object = {_ name: "daisy"}; object.defineproperty (object "," name ", {// имя метода здесь означает, что свойство имени определено (так что его можно получить через obj this._name;}}); alert (object.name); // "daisy" object.name = "jack"; // Определено только аксессу с getter, поэтому запись является недопустимым оповещением (object.name); // "daisy" object.name = "jack"; // только доктор getter определяется, так что написание является внедренной оповещением (объект);Обратите внимание, что имя свойства в object.defineproperty (Object, Pro, {}) должно соответствовать свойствам, доступным object.pro.
беременный Используйте ключевое слово get set:
var object = {_ name: "daisy", get name () {// Имя метода здесь означает, что атрибут имени определяется (так что его можно получить через object.name), определено только значение getter, не определено [[значение]] значение. Вернуть this._name;} // get, метод установки - это только свойство атрибута, а не метод объекта, который определяет, можно ли читать атрибут и записан}; alert (object.name); // Daisy метод удаления подчеркивания здесь - Daisy; Плюс это undefinebject.name = "jack"; // определяется только аксессу с Getter, поэтому его можно прочитать только, но не записывать содействие (object.name); // daisyВышеуказанные два метода эквивалентны. Обратите внимание, что оба приведенных выше двух метода будут иметь два атрибута в объекте объекта: _name (с начальным значением) Имя (без начального значения), которые можно увидеть через консоль браузера.
Итак, когда этот атрибут имени действительно определяется? Мы знаем, что object.defineproperty (Object, Pro, {}) может определить новое свойство Pro для объекта. Поскольку get pro () {}/set pro () {} и object.defineproperty (object, pro, {}) эквивалентны, также будет определено новое свойство Pro. Вот почему в объекте есть два свойства.
(3) Код реализации Accessor Accessor and Set в JavaScript в этой статье: связано с реализацией аксессуаров GET и SET стандартных стандартов: разумные мысли
Я сам написал пример
Функция foo (val) {this.value = val; // Атрибут значения определяется и нет _value} foo.prototype = {set value (val) {// Обратите внимание, что имя метода и имя атрибута одинаковы, атрибут значения определяется в прототике. Атрибут определяется в прототипе return this._value;}}; // Аксессор возвращает и устанавливает их, оба _name, и здесь нет определения. Почему это может быть прочитано или написано? ? ? ? var obj = new Foo ("Hello"); Alert (obj.value); // "hello" obj.value = "yehoo"; оповещение (obj.value); // "yehoo"Чтобы решить вышеуказанный вопрос, было сделано много тестов, давайте посмотрим на него один за другим:
Сначала посмотрите на этот пример. Только функция GET определяется в прототипе. При чтении атрибута значения в obj.value ищите его в экземпляре без него, а затем найдите его в прототипе. Метод GET называется, который можно прочитать только, но не написано.
Функция foo (val) {this._value = val; // Атрибут здесь подчеркнут, инициализирует атрибут _value объекта экземпляра, атрибут _value читается и записывается} foo.prototype = {// Установить значение (val) {// Обратите внимание, что имя метод одинаково, что атрибут, и атрибут значения. this._value = val; //}, get value () {// Имя метода такое же, как и имя атрибута, определяет атрибут значения и его атрибут GET в прототипе возвращает this._value;}}; var obj = new foo ("hello"); alert (obj.value); // Привет, доступ к значению в прототипе атрибут obj.value = "yehoo"; // только определяет атрибут Get имени атрибута, поэтому его можно прочитать, но не написано. Написать недействительную бдительность (obj.value); // ПриветЕсли это. Вы все еще можете контролировать чтение и написать атрибут значения. Другими словами, когда obj.value обращается к атрибутам, метод GET будет вызван, сначала поиск в самом объекте, если нет, то и поиск в прототипе. Если ничего нет, это будет считаться неопределенным. По умолчанию как читаемо, так и для записи.
Функция foo (val) {this.value = val; // Только функция get value определяется в прототипе, поэтому запись здесь является недействительной} foo.prototype = {// set value (val) {// Обратите внимание, что имя метода и имя атрибута одинаковы, установленная функция значения определено в прототипе // this._value = val; //}, // значение: "ха -ха", // даже если значение значения написано вручную, поскольку метод GET возвращает это. value () {// Имя метода такое же, как и имя атрибута. Атрибут значения и его атрибут GET определены в прототипе. Вернуть this._value;}}; var obj = new foo ("hello"); // "hello" не был успешно написан настороженно (obj.value); // Неопределенный obj.value = "yehoo"; // только определил атрибут Get, так что его можно прочитать только, но не написано, а запись является инвалидной блюд (obj.value);//////////////////ерваваировавшая вершина (obj./////////////////мол.Чтобы доказать, что приведенный выше пример читабелен, а не записывается: вручную написать _value: «ха», вы можете прочитать значение, но не можете его написать.
Функция foo (val) {this.value = val; // Только функция get value определяется в прототипе, поэтому запись здесь является недействительной} foo.prototype = {// set value (val) {// Обратите внимание, что имя метода и имя атрибута одинаковы, установленная функция значения определено в прототипе // this._value = val; //}, _ Значение: "ха -ха", // даже если значение значения написано вручную, поскольку метод GET возвращает это. value () {// Имя метода такое же, как и имя атрибута. Атрибут значения и его атрибут GET определены в прототипе. Вернуть this._value;}}; var obj = new foo ("hello"); // "hello" не был успешно написан настороженно (obj.value); // "ха -ха" obj.value = "yehoo"; // только атрибут Get определяется, так что его можно прочитать только, но не написано, а написание является индивидуальным блюдом (obj.value);Если значение: «ха» написано вручную, могу ли я стремиться прочитать значение значения? Поскольку это.
function foo (val) {this.value = val; // Только функция get value определяется в прототипе, поэтому запись здесь является недействительной} foo.prototype = {// set value (val) {// Обратите внимание, что имя метода и имя атрибута одинаковы, установленная функция значения определяется в прототипе // this. Даже если значение значения записывается вручную, поскольку метод GET возвращает это. value () {// Имя метода и имя атрибута одинаковы. Атрибут значения и его функция GET определены в прототипе. Вернуть this._value;}}; var obj = new foo ("hello"); // "hello" не был успешно написан (obj.value); // неопределенное чтение недействительно, потому что до тех пор, пока obj.value получите возвращение этого. предупреждение (obj.value); // не определенГлядя на этот пример, определяется GET SET, но возвращает это. Вы можете обнаружить, что значение может быть прочитано и можно записать. Удалить метод GET SET в прототипе, и он все еще может быть прочитано или написано
function foo (val) {this.value = val;} foo.prototype = {set value (val) {this._value = val;}, get value () {return this._value;}}; var obj = new foo ("hello"); alert (obj.value); // hello obj.value = "yehoo"; alert (obj.value); // yehoo function foo (val) {this.value = val;} // Это то же самое, что обычно, это не является новым. Foo ("hello"); alert (obj.value); // hello obj.value = "yehoo"; alert (obj.value); // yehooСуммировать
Только атрибут get pro () {} читается и не подлежит записи;
Только объявите атрибут SET Pro () {}, чтобы можно было записаться и нечитаемо.
Если ни одно из объявлений не объявлено, атрибуты можно читаемые и записаться на считанные записи;
Если все объявления сделаны, прочитайте и пишите в соответствии с методом, определяемым GET SET;
Если все объявлены, но определенный метод чтения и записи не может быть чтение и написан правильно, Get/Set не удастся. Стать по умолчанию читаемой и подлежащей записи
Атрибут значения, определенный в прототипе, определяет атрибут GET. Вы все еще можете контролировать чтение и написать атрибут значения. Другими словами, когда obj.value обращается к атрибутам, метод GET будет вызван, сначала поиск в самом объекте, а затем поиск в прототипе. Если ничего нет, это будет считаться неопределенным. По умолчанию как читаемо, так и для записи.
Пополнить:
Является ли использовать get pro () {}/set pro () {} или object.defineproperty (object, pro, {get: function () {return this._name;}});Pro не может быть таким же, как вернуть это. В противном случае сообщается о следующей ошибке: (я не знаю, почему, это кажется переполнением стека, вызванным моим собственным вызовом)
После коррекции мастера я понимаю, почему здесь сообщается об ошибке: если это значение возвращается в методе get value () {}, метод получения значения снова будет вызван, тем самым попадает в мертвый цикл, в результате чего стек метода переполняется.