Мое понимание этого всегда было только в том, чтобы использовать его и знать это, но я не углубился в ее сущность. На этот раз у меня есть глубокое понимание с «JavaScript хорошими частями». (Вся отладка можно увидеть в консоли, ключ браузера F12)
Давайте посмотрим на это вместе.
Когда мы объявляем функцию, каждая функция имеет два дополнительных параметра (формальные параметры), один из которых является этим, а другой - аргументы. Аргументы являются параметрами, фактически принятыми функцией, и являются массивом классов. Я только расскажу о аргументах, и мы сосредоточимся на этом указателе.
При объектно-ориентированном преобразовании это очень важно, и его значение зависит от шаблона вызова. В JavaScript в общей сложности 4 шаблона: шаблоны вызова метода, шаблоны вызова функций, шаблоны вызова конструктора и применение призванных шаблонов.
Метод вызова режима
Когда функция является атрибутом в качестве объекта, мы обычно называем эту функцию методом этого объекта. Когда этот метод вызывается, это указывает на объект, к которому принадлежит метод.
Кода -копия выглядит следующим образом:
<script type = "text/javascript">
var people = {
Имя: "Yika",
sayName: function () {
console.log (this.name); // "Йика"
// это было связано с объектом людей
}
}
people.sayname ();
</script>
Как показано каштаном, это указывает на объект SayName. Этот метод получения контекста объекта через это является публичным методом. (Метод Publice)
Функциональный режим вызова
Когда вызывается функция, не является методом на объекте, она называется функцией.
Этот вызов шаблона будет указывать на окно -объект, даже если эта функция может быть вызвана во внешней функции, давайте посмотрим на него.
Кода -копия выглядит следующим образом:
<script type = "text/javascript">
var name = "window-yika";
var people = {
Имя: "Люди-Йика",
Студент: function () {
console.log (это); // это связывает объект людей здесь
Функция говорит name () {
var name = "sayname-yika";
console.log (this.name); // window-yika
// Даже если сама функция SayName и объект People, она находится, имеют значение имени, это указывает на окно
};
SayName ();
}
}
People.Student ();
</script>
С этой точки зрения, знаете ли вы, как решить JavaScript «Ошибка дизайна».
Да, просто кэшируйте это в функции студента, то есть строка 6. Затем перенесите это на функцию SayName через переменные, чтобы решить ее!
Кода -копия выглядит следующим образом:
var people = {
Имя: "Люди-Йика",
Студент: function () {
var self = это; // кэшировать это
Функция говорит name () {
var name = "sayname-yika";
console.log (self.name); // "People-yika", в настоящее время я указывает на объект людей
};
SayName ();
}
}
Режим вызова конструктора
Когда JavaScript рассказывает о конструкторах, вы подумаете: «Имя функции заглаживалось! Используйте новый оператор при вызове!» Название функции Капитализация легко понять, чтобы стандартизировать именование конструктора. Но вы когда -нибудь углубились в то, почему вам нужно использовать новое? Если вы называете новую функцию с новой, фон функции создаст новый объект, указывающий на прототип функции, и это также связано с новым объектом. JavaScript - это язык, основанный на прототипе наследования. Студенты, которые не очень четко понимают прототипы прототипов, могут самостоятельно проверять информацию. Я сосредотачиваюсь на этом.
Давайте сначала посмотрим на то, как обычно выглядит конструктор.
Кода -копия выглядит следующим образом:
<script type = "text/javascript">
Функция людей (имя) {
this.name = name; // это здесь указывает на новый объект Yika после того, как позвонил по новым
this.sayname = function () {
console.log (this.name); //Выход
}
}
var yika = новые люди ("yika");
Yika.sayname (); // Вывод "Yika" Поскольку Yika получается через новый вызов, это связано с объектом Yika.
</script>
На первый взгляд, кажется, что это нелегко понять. Почему это указывает на окно в функции только сейчас, и теперь вы можете указать на функционирование людей без кэша?
Это не имеет значения. Разве вы просто не сказали, что функция будет делать «делать плохие вещи» тайно, позвонив новым? Посмотрим, что именно вы сделали.
Кода -копия выглядит следующим образом:
<script type = "text/javascript">
Функция людей (имя) {
var, что = {}; // Плохая вещь: сгенерировать объект самостоятельно
that.name = name;
that.sayname = function () {
console.log (that.name);
};
вернуть это; // Плохая вещь 2, вы измените поведение возврата, верните только что сгенерированный объект
}
var yika = people ("yika"); // Новое может быть опущено здесь и подражает вызову новому оператору
Yika.sayname (); // вывод "yika" как только сейчас
</script>
Вы можете видеть ясно таким образом. Новый будет не только генерировать объект, но и автоматически вернуть объект, так что это естественно укажет на этот новый объект.
Не забудьте использовать новое, чтобы вызвать конструктор, в противном случае не будет никакого предупреждения, если что -то пойдет не так, и все соглашения о капитале все еще очень необходимы.
Применить режим вызова
Метод применения позволяет нам создать массив параметров, передаваемых в функцию вызова, что также позволяет нам изменить это значение.
function.apply (это связанное значение, массив параметров аргументов)
Есть так много вещей, которые я могу сказать, я дам вам только каштан, чтобы помочь вам понять:
Кода -копия выглядит следующим образом:
<script type = "text/javascript">
Функция людей (имя) {
this.name = name;
this.sayname = function () {
console.log (this.name); // метод SayName принадлежит конструктору народа
}
}
Функция студента (имя) {
People.apply (это, аргументы); // Метод интеграции заимствования конструкторов - это называть людей конструкторами, подавая в силу в конструкторе студентов и изменяет эту ценность народа
// Таким образом, каждый раз, когда создается студенческий экземпляр, конструктор людей будет называться
}
var студент = новый студент ("yika");
Student.sayname (); // вывод "yika"
</script>
Мы можем легко изменить функцию этого объекта привязки применения. Вызов, аналогичный применению, также имеет тот же эффект. Заинтересованные студенты могут искать и изучать это самостоятельно.
Ну, наконец, мы закончили менять четыре режима вызова этого. Режим вызова метода и режим вызова конструктора будет использоваться больше, и это будет более важно. Для режима вызова функции мы должны научиться избегать ловушек в нем.
Если есть какие -либо ошибки, пожалуйста, сообщите об этом вовремя, и я исправим ее как можно скорее, чтобы предотвратить заблуждение других. Спасибо!