1. Это указывает на объект Constructor Constrantiation
В предыдущей статье мы упомянули разницу между использованием новых и не вызывающих конструкторов, как показано в следующем примере:
Кода -копия выглядит следующим образом:
Функция Benjamin (имя пользователя, секс) {
this.username = имя пользователя;
this.sex = sex;
}
var benjamin = new Benjamin ("zuojj", "мужчина");
// Выходы: Бенджамин {Sex: "Мужчина", имя пользователя: "Zuojj"}
Console.log (Benjamin);
var ben = benjamin ("Чжангсан", "Женский");
// Выходы: неопределенные
console.log (ben);
Когда конструктор называется обычной функцией, значение не возвращается, и это указывает на глобальный объект. Итак, как мы можем избежать проблем, вызванных отсутствием новых ключевых слов?
Кода -копия выглядит следующим образом:
Функция Benjamin (имя пользователя, секс) {
// Проверьте, является ли «это» объект «бенджамин»
if (этот экземпляр бенджамина) {
this.username = имя пользователя;
this.sex = sex;
}еще {
вернуть новый Бенджамин (имя пользователя, секс);
}
}
var benjamin = new Benjamin ("zuojj", "мужчина");
// Выходы: Бенджамин {Sex: "Мужчина", имя пользователя: "Zuojj"}
Console.log (Benjamin);
var ben = benjamin ("Чжангсан", "Женский");
// Выходы: Бенджамин {Имя пользователя: "Чжангсан", Секс: "Женщина"}
console.log (ben);
В приведенном выше примере мы сначала проверяем, является ли это экземпляром Бенджаммина, если нет, используйте новое, чтобы автоматически вызовать конструктор и создать его, что означает, что нам больше не нужно беспокоиться о пропущенном конструкторе создания нового ключевого слова. Конечно, мы можем развивать плохую привычку таким образом. Что если мы избегаем этого явления? Мы можем добавить ошибку как это:
Кода -копия выглядит следующим образом:
Функция Benjamin (имя пользователя, секс) {
// Проверьте, является ли «это» объект «бенджамин»
if (этот экземпляр бенджамина) {
this.username = имя пользователя;
this.sex = sex;
}еще {
// если нет, добавьте ошибку.
выбросить новую ошибку ("` benjamin ', призванная без "нового" ");
}
}
2. Это указывает на объект, который вызывает функцию
См. Следующий пример:
Кода -копия выглядит следующим образом:
var x = 10;
var obj = {
x: 10,
вывод: function () {
// Выходы: true
console.log (это === obj);
вернуть это.x;
},
innerRobj: {
x: 30,
вывод: function () {
// Выходы: true
console.log (это === obj.innerobj);
вернуть это.x;
}
}
};
// Выходы: 10
console.log (obj.output ());
// Выходы: 30
console.log (obj.innerobj.output ());
3. Это указывает на глобальный объект
При обсуждении конструктора выше, мы также обсудили, что, когда новое не применимо, это будет указывать на глобальный объект. Давайте посмотрим на два общих примера, которые подвержены ошибкам:
Кода -копия выглядит следующим образом:
var x = 100;
var obj = {
x: 10,
вывод: function () {
(function () {
// Выходы: true
console.log (это === окно);
// Выходы: внутренние: 100
console.log ("inner:" + this.x);
}) ();
вернуть это.x;
}
};
// Выходы: 10
console.log (obj.output ());
При использовании закрытия изменяется область прицела, и это указывает на окно (в браузере).
Кода -копия выглядит следующим образом:
var x = 100;
var obj = {
x: 10,
вывод: function () {
вернуть это.x;
}
};
var output = obj.Output;
// Выходы: 10
console.log (obj.output ());
// Выходы: 100
console.log (output ());
var obj2 = {
x: 30,
Вывод: obj.Output
}
// Выходы: 30
console.log (obj2.output ());
В настоящее время это всегда указывает на объект во время вызова функции.
4. Это указывает на объект, назначенный методом Apply/call ()
Кода -копия выглядит следующим образом:
var x = 100;
var obj = {
x: 10,
вывод: function () {
вернуть это.x;
}
};
// Выходы: 10
console.log (obj.output ());
var obj2 = {
x: 40,
Вывод: obj.Output
}
// Выходы: 40
console.log (obj.output.call (obj2));
// Выходы: 10
console.log (obj2.output.apply (obj));
5. Это из функции обратного вызова указывает на объект, на который указывает эту функцию, которая вызывает обратный вызов.
Кода -копия выглядит следующим образом:
// <input type = "text" value = "3" id = "txt_username">
$ ("#username"). On ("click", function () {
console.log (this.value);
});
6. Это в function.prototype.bind
Метод Bind () создает новую функцию, которая при вызове имеет свое ключевое слово, установленное для предоставленного значения, с данной последовательности аргументов, предшествующей любым предоставленным при вызове новой функции.
Пример 1:
Кода -копия выглядит следующим образом:
функция Person () {
вернуть это. name;
}
//Function.prototype.bind
var per = Person.bind ({
Имя: "Zuojj"
});
Консоль.log (per);
var obj = {
Имя: "Бен",
человек: человек,
за: пер
};
// Выходы: Бен, Zuojj
console.log (obj.person (), obj.per ());
Пример 2:
Кода -копия выглядит следующим образом:
this.x = 9;
var module = {
x: 81,
getX: function () {return this.x; }
};
// Выходы: 81
console.log (module.getx ());
var getx = module.getx;
// Выходы: 9, потому что в этом случае «это» относится к глобальному объекту
console.log (getx);
// Создать новую функцию с «этим», связанным с модулем
var boundgetx = getx.bind (модуль);
// Выходы: 81
console.log (boundgetx ());