В Javascritp это не обязательно единственный контекст метода объекта.
Это может быть глобальный объект, текущий объект или любой объект, полностью в зависимости от того, как вызывается функция. В JavaScript существует несколько способов вызовов: как вызовы метода объекта, в качестве вызовов функций, в качестве вызовов конструктора, и с использованием вызовов Apply или вызовов.
1. Вызов как объект метод
В Javascript функции также являются объектами, поэтому функции могут использоваться в качестве атрибутов объекта.
Кода -копия выглядит следующим образом:
var point = {
x: 0,
y: 0,
Moveto: function (x, y) {
this.x = this.x + x;
this.y = this.y + y;
}
};
point.moveto (1, 1) // Это связывается с текущим объектом, то есть объект точки
2. Как вызов функции
Функция также может быть вызвана напрямую, и это связано с глобальным объектом. В браузере окно является глобальным объектом. Например, следующий пример: когда вызывается функция, это связано с глобальным объектом, и оператор назначения выполняется далее, что эквивалентно неявно объявляющему глобальной переменной, которая, очевидно, не то, чего хочет абонент.
Кода -копия выглядит следующим образом:
Функция makenoSense (x) {
this.x = x;
}
MakenSense (5);
x; // x стала глобальной переменной со значением 5
Для внутренних функций, то есть объявленных функций в теле другой функции, этот способ связывания с глобальным объектом создаст другую проблему. Мы будем продолжать использовать объект точки, упомянутый ранее в качестве примера. Результат может быть неожиданным.
Кода -копия выглядит следующим образом:
var point = {
x: 0,
y: 0,
Moveto: function (x, y) {
// внутренние функции
var movex = function (x) {
This.x = x; // Где это связано?
};
// внутренние функции
var movey = function (y) {
this.y = y; // где это связано?
};
movex (x);
Двигатель (Y);
}
};
point.moveto (1, 1);
point.x; // ==> 0
point.y; // ==> 0
x;
у; // ==> 1
Это дизайн -недостаток JavaScript.
Кода -копия выглядит следующим образом:
var point = {
x: 0,
y: 0,
Moveto: function (x, y) {
var that = это;
// внутренние функции
var movex = function (x) {
что.x = x;
};
// внутренние функции
var movey = function (y) {
что .y = y;
}
movex (x);
Двигатель (Y);
}
};
point.moveto (1, 1);
point.x; // ==> 1
point.y; // ==> 1
Называется конструктором
JavaScript поддерживает объектно-ориентированное программирование. Соответственно, конструкторы в JavaScript также очень особенные. Как другое обычное правило, конструктор начинается с заглавных букв, чтобы напомнить вызывающему, чтобы позвонить правильно. Если вызов верен, он связан с недавно созданным объектом.
Кода -копия выглядит следующим образом:
точка функции (x, y) {
this.x = x;
this.y = y;
}
Вызов с помощью Apply или вызов
Давайте повторим, что в Javascript функции также являются объектами, объекты имеют методы, а применение и вызов являются методами функциональных объектов. Эти два метода чрезвычайно мощные, и они позволяют переключать контекст выполнения функции, то есть объект, связанный с этим. Этот метод используется во многих методах JavaScript и классовых библиотеках. Давайте посмотрим на конкретный пример:
Кода -копия выглядит следующим образом:
точка функции (x, y) {
this.x = x;
this.y = y;
this.moveto = function (x, y) {
this.x = x;
this.y = y;
}
}
var p1 = новая точка (0, 0);
var p2 = {x: 0, y: 0};
p1.moveto (1, 1);
p1.moveto.apply (P2, [10, 10]);
В приведенном выше примере мы используем конструктор для генерации объекта P1, который также имеет метод Moveto; Другой вызов метода также имеет такую же функцию, разница в том, что последний параметр не передается в униформе в качестве массива, но передается отдельно.
Кода -копия выглядит следующим образом:
функция foo () {
//1. Этот конструктор с ссылкой является объектом, на который ссылаются Argys.callee
// инструкции являются конструкторами, выполненными через новый оператор
if (this.constructor == Arguments.callee) {
Alert ('объект создан');
}
//2. Это окно, тогда это глобальный звонок
if (this == window) {
оповещение («нормальный вызов»);
}
else {// 3.
Alert ('называется'+ this.constructor);
}
}
Foo (); // глобальный вызов функции
Foo.call (new object ()); // call в качестве метода элемента объекта объекта
new foo (); // вызванный новым оператором для выполнения строительства объектов