Основы AJAX: реализация классов в JavaScript. В JavaScript вы можете использовать ключевое слово function для определения «класса» и способа добавления членов в класс. Переменные или методы, на которые ссылается этот указатель внутри функции, станут членами класса. Например:
Ниже приведен фрагмент кода:
function class1(){.
вар s="abc";
this.p1=s;
this.method1=function(){
alert("это тестовый метод");
}
}
вар obj1 = новый класс1 ();
Получите объект obj1 с помощью new class1(), и объект obj1 автоматически получит атрибут p1 и метод Method1.
В JavaScript определение функции само по себе является конструктором класса. Сочетая свойства объектов, представленные ранее, и использование оператора new, ниже описывается процесс создания объектов с использованием new.
(1) Когда интерпретатор встречает новый оператор, он создает пустой объект
(2) начинает выполнять функцию class1 и указывает указатель this на вновь созданный объект
; При присвоении значения атрибуту интерпретатор создаст атрибут для объекта. Например, в классе1 при выполнении оператора this.p1=s будет добавлен атрибут p1 и значение переменной s будет равно. присвоено ему, так что выполнение функции является процессом инициализации этого объекта, то есть реализации роли конструктора
(4) При выполнении функции новый оператор возвращает инициализированный объект;
На протяжении всего этого процесса базовый объектно-ориентированный механизм реализуется в JavaScript. Видно, что в JavaScript определение функции на самом деле предназначено для реализации конструктора объекта, который завершается с помощью функций. Недостатками этого метода являются:
· При объединении всех операторов инициализации и определений членов логика кода недостаточно ясна, и сложно реализовать сложные функции.
·Каждый раз, когда создается экземпляр класса, конструктор должен быть выполнен один раз. Свойства и методы, определенные в конструкторе, всегда создаются повторно. Например:
следующий фрагмент кода:
this.method1=function(){.
alert("это тестовый метод");
}
Каждый раз, когда метод1 здесь создает экземпляр класса1, он создается один раз, что приводит к пустой трате памяти. В следующем разделе представлен еще один механизм определения класса: объект-прототип, который может устранить недостатки, вызванные определением членов класса в конструкторе.
Использование объектов-прототипов для определения членов класса.
В предыдущем разделе был представлен механизм реализации классов и реализация конструкторов. Теперь мы представляем другой механизм добавления членов в классы: объекты-прототипы. При создании новой функции члены объекта будут автоматически назначены созданному объекту. Например:
Ниже приведен фрагмент кода:
<script Language="JavaScript" type="text/javascript">
<!--
//Определяем функцию класса class1(){ только с одним атрибутом
this.prop=1;
}
//Используйте атрибут прототипа функции для определения новых членов класса class1.prototype.showProp=function(){
оповещение(this.prop);
}
//Создаем экземпляр класса1 var obj1=new class1();
//Вызов метода showProp, определенного через объект прототипа прототипа obj1.showProp();
//-->
</скрипт>
Прототип — это объект JavaScript, который может добавлять, изменять и удалять методы и свойства объекта-прототипа. Это добавляет определения членов в класс.
Теперь, когда мы понимаем объект-прототип функции, давайте посмотрим на процесс выполнения new.
(1) Создайте новый объект и позвольте этому указателю указать на него;
(2) Назначьте все члены объекта-прототипа функции этому новому объекту
(3) Выполните тело функции и инициализируйте объект
(4) ) возвращает объект
;созданный в (1).
По сравнению с процессом выполнения new, представленным в предыдущем разделе, существует дополнительный процесс использования прототипа для инициализации объекта. Это также соответствует буквальному значению прототипа, который является прототипом экземпляра соответствующего класса. Этот процесс инициализации происходит до выполнения тела функции (конструктора), поэтому свойства и методы, определенные в прототипе, можно вызывать внутри тела функции. Например:
Ниже приведен фрагмент кода:
<script Language="JavaScript" type="text/javascript">
<!--
//Определяем класс только с одним атрибутом
класс функции1(){
this.prop=1;
это.showProp();
}
//Используйте атрибут прототипа функции для определения новых членов класса
class1.prototype.showProp=function(){
оповещение(this.prop);
}
//Создаем экземпляр класса1
вар obj1 = новый класс1 ();
//-->
</скрипт>
По сравнению с предыдущим кодом, здесь метод showProp, определенный в прототипе, вызывается внутри класса 1, так что в процессе создания объекта появляется диалоговое окно, показывающее, что значение атрибута prop равно 1.
Следует отметить, что определение объекта-прототипа должно быть перед оператором, создающим экземпляр класса, иначе он не будет работать. Например:
Ниже приведен фрагмент кода:
<script Language="JavaScript" type="text/javascript">
<!--
//Определяем класс только с одним атрибутом
класс функции1(){
this.prop=1;
это.showProp();
}
//Создаем экземпляр класса1
вар obj1 = новый класс1 ();
//Используйте атрибут прототипа функции для определения новых членов класса после оператора, создающего экземпляр. Это будет эффективно только для объектов, созданных позже.
class1.prototype.showProp=function(){
оповещение(this.prop);
}
//-->
</script>
Этот код сгенерирует ошибку времени выполнения, указывающую, что у отображаемого объекта нет метода showProp, поскольку этот метод определен после оператора, создающего экземпляр класса.
Видно, что объект-прототип предназначен для членов класса дизайна. Он тесно связан с классом. Кроме того, прототип также имеет важный атрибут: конструктор, который представляет собой ссылку на конструктор
. Ниже приведен фрагмент кода:
класс функции1(){
предупреждение(1);
}
class1.prototype.constructor(); //Вызов конструктора класса
После запуска этого кода появится диалоговое окно с текстом «1». Это показывает, что прототип тесно связан с определением класса. На самом деле: class1.prototype.constructor===class1.
Шаблон проектирования классов JavaScript.
Мы уже рассказали, как определить класс и как инициализировать экземпляр класса. Класс может добавлять члены в тело функции, определенное функцией, а также может использовать прототип для определения членов класса. Программный код кажется запутанным. Как четко определить классы? Ниже приведен шаблон реализации класса.
В JavaScript из-за гибкой природы объектов члены класса также можно добавлять в конструкторе, что не только повышает гибкость, но и увеличивает сложность кода. Чтобы улучшить читаемость и эффективность разработки кода, вы можете использовать этот способ определения членов и вместо этого использовать объект-прототип. Таким образом, определение функции является конструктором класса, который соответствует реализации. традиционного класса: имя класса и имя конструктора одинаковы. Например:
Вот фрагмент кода:
класс функции1(){
//Конструктор
}
//Определение члена
class1.prototype.someProperty="sample";
class1.prototype.someMethod=function(){
//Код реализации метода
}
Хотя приведенный выше код сделал определение класса намного более ясным, каждый раз, когда определяется свойство или метод, необходимо использовать class1.prototype. Мало того, что размер кода становится больше, но и читаемости становится недостаточно. Для дальнейшего улучшения вы можете использовать конструктор нетипизированного объекта, чтобы указать объект-прототип для реализации определения члена класса:
Ниже приведен фрагмент кода:
//Определяем класс class1
класс функции1(){
//Конструктор
}
//Реализуем определение члена класса, указав объект-прототип
class1.prototype={
someProperty:"образец", someMethod:function(){
//код метода
},
...//Другие свойства и методы.
}
Приведенный выше код очень четко определяет класс 1. Конструктор реализуется непосредственно с именем класса, а члены определяются с использованием нетипизированных объектов. Все свойства и методы реализованы в виде списка и могут быть инициализированы одновременно с ними. определенное значение атрибута. Это также больше похоже на реализацию классов в традиционных объектно-ориентированных языках. Просто определения конструктора и членов класса разделены на две части. Это можно рассматривать как фиксированный шаблон определения классов в JavaScript, который облегчит понимание при его использовании.
Примечание. Ссылки между членами класса должны осуществляться через этот указатель. Например, в методе someMethod в приведенном выше примере, если вы хотите использовать атрибут someProperty, вы должны передать форму this.someProperty, поскольку в JavaScript каждый из них. свойства и методы независимы, они связаны с объектом через этот указатель.