представлять
Это играет очень важную роль в различном объектном программировании и в основном используется для указания на вызывающий объект. Однако в JavaScript производительность сильно различается, особенно в разных контекстах выполнения.
Из предыдущей статьи мы знаем, что это также атрибут в контексте выполнения, поэтому он должен быть неотделим от контекста выполнения.
Скопируйте код кода следующим образом:
активныйExecutionContext = {
ВО: {...},
это: этоЗначение};
В Javascript значение этого параметра зависит от режима вызова. Существует четыре режима вызова: режим вызова метода, режим вызова функции, режим вызова конструктора и режим применения вызова.
режим вызова
Шаблон вызова метода
Когда функция сохраняется как свойство объекта, мы называем ее методом. Когда вызывается метод, this привязывается к объекту, то есть this в шаблоне вызова метода указывает на вызывающий объект. Это очень легко понять. Вы — мой метод, вы принадлежите мне, и, конечно же, ваше это указывает на меня.
Скопируйте код кода следующим образом:
вар myObject = {
значение: 0,
приращение: функция (вкл) {
this.value += typeof inc === «число» inc: 1;
}
}
мойОбъект.инкремент();
console.log(myObject.value); //Вывод: 1
мойОбъект.инкремент(3);
console.log(myObject.value); //Выход: 4
Поскольку через него вы можете получить доступ к объекту, к которому принадлежите, вы можете вызывать и изменять свойства или методы объекта через него. Как видно из предыдущей статьи, this, как член атрибутов в контексте выполнения, должен быть создан при создании контекста. Вся привязка this к объекту происходит во время вызова, который представляет собой ". отложенное связывание». Высокая степень повторного использования может быть достигнута за счет отложенного связывания.
Скопируйте код кода следующим образом:
функция showValue(){
console.log(this.value);
}
вар а = {значение: "а"};
вар б = {значение: "б"};
а.showValue = showValue;
b.showValue = showValue;
a.showValue(); //Вывод "а"
b.showValue(); //Вывод «б»
Функция showValue в приведенном выше примере относится к отложенному связыванию.
шаблон вызова функции
Когда функция вызывается не как метод объекта, это вызов функции. В режиме вызова функции это привязано к глобальному объекту. (Это ошибка в языковом дизайне)
Скопируйте код кода следующим образом:
myObject.double = функция(){
вар, что = это //Решение;
вар помощник = функция() {
console.log(that, ": ", that.value); //Выходной объект {значение: 4, приращение: функция, двойное: функция} ": " 4
console.log(this, ": ", this.value); //Окно вывода {top: Window, window: Window…} ": " не определено
}
помощник(); //Вызов как функция
}
Согласно нормальному мышлению, вывод в четвертой строке должен указывать на объект, которому принадлежит функция. Однако из-за проблем с языковым дизайном это указывает на глобальный объект. Это делает ситуацию еще более загадочной и непредсказуемой. Но мы, разработчики, определенно не хотим видеть эту ситуацию. Играть в карты — это неразумно. К счастью, в приведенном выше примере это тоже очень простое решение. Таким образом, вызов этого вспомогательного метода можно использовать как этот, что просто и удобно. Что касается режима вызова функции, то почему он так себя ведет, будет подробно объяснено позже при анализе ссылочного типа.
Шаблон вызова конструктора
Поскольку JavaScript основан на прототипном наследовании, его разработчики хотят, чтобы он мог создавать объекты с помощью новых и конструкторов, подобных традиционным объектно-ориентированным языкам, реализующим объектно-ориентированное программирование. Кажется, это не очень хорошая идея, и немного неловко рисовать тигра вместо собаки. Во-первых, научиться невозможно, но учиться и не нужно. Механизм прототипного наследования JavaScript уже достаточно мощный, чтобы обеспечить полиморфизм наследования, необходимый для объектно-ориентированного подхода.
Без лишних слов, давайте поговорим о шаблоне вызова конструктора. Шаблон вызова конструктора очень прост: использовать функцию в качестве конструктора, а затем использовать ее для представления свойств и методов, которые вы собираетесь сделать общедоступными. следующее
Скопируйте код кода следующим образом:
функция Person(имя, возраст){
это.имя = имя;
this.age = возраст;
this.say = функция(){
console.log("имя: %s, возраст: %n", this.name, this.age);
}
}
вар p1 = новый человек («Джинк», 24);
p1.say(); //Имя вывода: jink, возраст: 24
var p2 = новый человек("Чжан Сан", 33);
p2.say();//Имя вывода: Чжан Сан, возраст: 33
Из приведенного выше примера мы ясно видим, что это указывает на объект, созданный с помощью new и конструктора. Почему это происходит? Это связано с тем, что при вызове конструктора через new в JavaScript оператор new вызывает внутренний метод [[Construct]] функции «Person», а затем, после создания объекта, внутренний метод [[Call]] вызывается. называется. Все та же функция «Человек» устанавливает значение this вновь созданному объекту.
применить режим вызова
После создания всех функций в JavaScript у них будет два метода: apply и call. Я не хочу здесь подробно объяснять конкретное использование этих двух методов. Студенты, которые не знают, могут поискать на Baidu. Это довольно просто. Мы можем установить это вручную двумя способами. Хотя это не разрешается изменять во время создания, если мы вручную установим это перед созданием, это другое дело. Эта настройка потрясающая: вы можете заставить свой объект вызывать любой метод, точно так же, как вы можете заставить машину плывущей по морю, африканского слона двигаться как ягуар, а программиста играть как пианиста. Ха-ха, фантазия всегда прекрасна. Вызов есть вызов, но можно ли реализовать функцию после вызова – это другой вопрос.
Скопируйте код кода следующим образом:
вар программист = {
имя: "Программист",
рука: «гибкие руки»,
программа: функция(){
console.log(this.name+"Напишите код с помощью "+this.hand+".");
}
}
вар пианист = {
имя: «пианист»,
рука: «гибкие руки»,
играть: функция() {
console.log(this.name+"Воспроизводите прекрасную музыку с помощью "+this.hand+".");
}
}
вар игрок = {
имя: «Спортсмен»,
стопа: «Сильные ноги»,
запустить: функция(){
console.log(this.name+"Используйте "+this.foot+" для бега по полю.");
}
}
//Следуем правилам
programr.programme(); //Программисты пишут код гибкими руками.
pianist.play(); //Пианист использует свои гибкие руки, чтобы играть красивую музыку.
player.run(); //Спортсмены бегут по полю с сильными ногами.
//причудливый
pianist.play.apply(programmer); //Программисты используют свои гибкие руки, чтобы воспроизводить красивую музыку.
player.run.apply(programmer); //Программисты используют undef для бега по полю. Из-за отсутствия физических упражнений у меня нет сильных ног.
Кажется интересным увидеть выше. Первый параметр apply — это указатель this в методе выполнения. Таким образом, мы можем заимствовать чужие методы и сами тайно использовать их, что чрезвычайно удобно. Этот тип техники часто используется в некоторых средах.
Подвести итог
Это все, что я могу сказать по этому поводу. Я считаю, что после прочтения у каждого будет некоторое представление о том, как это определяется в различных ситуациях. Изначально я планировал обсудить ссылочный объект дальше и объяснить его значение в режиме вызова метода. и режим вызова функций, но я боялся, что длина будет слишком длинной, поэтому решил использовать отдельную главу для анализа концепции ссылочных объектов.