Понимание области видимости в объектно-ориентированном JavaScript

Метки: веб-разработка, javascript

Розуміння області видимості в об’єктно-орієнтованому JavaScript Розуміння області видимості в об’єктно-орієнтованому JavaScript
Understanding scope in object oriented JavaScript Understanding scope in object oriented JavaScript

Когда вы думаете о ключевом слове this, вы, наверное, считаете, что оно относится к текущему экземпляру класса. Это верно для большинства объектно-ориентированных языков, как C# и Java.
Например, я мог бы использовать this в C# таким образом:
Убрать подсветку кода
1
2
3
4
5
6
class Cat {
    string _name;
    public Cat(string name) {
        this._name = name;
    }
}

В этом примере вы можете видеть иллюстрацию этого. В C# и Java, this всегда относится к экземпляру класса.
Итак, зная это, вы наверное решите, что та же ситуация будет в JavaScript и его this. Тем не менее, это не тот случай. Как и многое в написании объектно-ориентированного кода JavaScript, this ведет себя по-разному в некоторых ситуациях. В зависимости от того как вы используете this, он может не всегда указывать на экземпляр класса.
Убрать подсветку кода
1
2
3
function Cat(name) {
    this.Name = name;
}

В этом примере все работает точно так же как и в примере с C#, но давайте просмотрим на пример, где вещи могут работать неправильно, если не знать некоторых правил.
Убрать подсветку кода
1
2
3
4
5
6
7
8
9
10
11
12
13
14
var wrong = new WrongClass();
wrong.publicMethod();
 
function WrongClass() {
    this.publicProperty = 'props';
    this.publicMethod = function() {
        console.log('public method');
        privateMethod();
    };
    var privateMethod = function() {
        console.log('private method');
        console.log('public property equals ' + this.publicProperty);
    };
}

В своих примерах, для вывода данных я использую объект console из Firebug.
Так что же не так с этим примером? Все выглядит правильно и должно работать, не так ли? Хорошо, оперируя предположением, что this всегда указывает на экземпляр класса, данный пример абсолютно верен. Тем не менее, мы используем JavaScript и не должны удивляться тому, что он делает вещи немного по-другому.
При вызове publicMethod(), было бы выведено:
Убрать подсветку кода
1
2
3
>>> public method
>>> private method
>>> public property equals undefined

Причина, по которой this.publicProperty равно undefined, в том, что когда вводится приватный метод, область видимости this меняется. Оно больше не означает текущий экземпляр класса "WrongClass", теперь оно означает текущий экземпляр функции "privateMethod".
Другая ситуация, где область видимости this должно было бы поменяться, это когда оно работает с обработчиком событий.
Убрать подсветку кода
1
2
3
document.getElementById('button').onclick = function() {
    alert(this.id);
}

В этом примере, this будет указывать на элемент "button". Существует множество случаев изменения области видимости, с которыми вы должны быть знакомы, когда имеете дело с объектно-ориентированными технологиями.
Вернемся к нашему примеру с "WrongClass". Я покажу Вам, как сделать, чтобы этот пример работал так, как вы этого ожидали вначале.
Убрать подсветку кода
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
var right = new RightClass();
right.publicMethod();
 
function RightClass() {
    var self = this;
    this.publicProperty = 'props';
    this.publicMethod = function() {
        console.log('public method');
        privateMethod();
    };
    var privateMethod = function() {
        console.log('private method');
        console.log('public property equals ' + self.publicProperty);
    };
}

Вы заметили, что я объявил в коде новую переменную self. Я присвоил этой переменной значение this. Это позволило мне использовать переменную "self" в любое время, когда мне нужно обратиться к экземпляру класса, не беспокоясь при этом про область видимости.
Вы можете назвать вашу переменную как угодно, но "self" является общей практикой. Итак, сейчас в "privateMethod", когда вызывается "publicProperty", используется "self" и оно выведет соответствующее значение.
Убрать подсветку кода
1
2
3
>>> public method
>>> private method    
>>> public property equals props


Оригинал: Understanding scope in object oriented JavaScript

Рейтинг: 12345   << Вы можете поставить оценку этой статье


Подобные статьи:
   6 инструментов чтобы быть эффективным Web-разработчиком
   Введение в искусство модульного тестирования в PHP
   Интеграция FCKeditor в Zend_Form
   Автоматизированное тестирование с использованием Zend Framework
   Паттерн кэширования для моделей


Обсуждение статьи:

 
apapacy [2009-06-13]
Не думаю что происходит понимание области видимости.
Скорее просто используется неоправданное замыкание.

Больше заявленной теме соответсвует такой код (к Вам как переводчику это замечание не относится)

var right = new RightClass();
right.publicMethod();

function RightClass() {
//var self = this;
this.publicProperty = 'props';
this.publicMethod = function() {
console.log('public method');
this.privateMethod();
};
var privateMethod = function() {
console.log('private method');
console.log('public property equals ' + this.publicProperty);
};
}


moroz1999 [2009-07-19]
apapacy: приведённый вами вариант не работает и работать не может, поскольку privateMethod вызывается через this, не будучи на этот самый this предварительно назначенным.


keeper [2010-11-21]
Неестественные для русского языка обороты рассеивают внимание. Если не трудно, пожалуйста, переработайте статью.


HeeL [2010-11-21]
keeper, укажите на места где есть неестественные обороты и мы рассмотрим возможные варианты улучшения статьи


Денис [2011-06-28]
Очень даже все понятно!


StepanTop [2016-03-13]
Предлагаем услугу рассылки вашей информации на 100.000 тысяч сайтов! База сайтов состоит из русскоязычных форумов, досок объявлений, блогов, гостевых книг. В результате рассылки вашу рекламу увидят десятки тысяч людей.

Как можно использовать рассылку?
1. Для рекламы своих товаров, услуг, рассылки объявлений различного характера
2. Для привлечения переходов на сайт.
3. Для наращивания ссылок на сайт.
4. Для рассылки информации о себе либо своей фирме в Интернете, с целью "забить" поисковую выдачу
5. Для распространения любой другой информации

Почта для связи: mandrepnes@gmail.com


StepanTop [2016-03-13]
Предлагаем услугу рассылки вашей информации на 100.000 тысяч сайтов! База сайтов состоит из русскоязычных форумов, досок объявлений, блогов, гостевых книг. В результате рассылки вашу рекламу увидят десятки тысяч людей.

Как можно использовать рассылку?
1. Для рекламы своих товаров, услуг, рассылки объявлений различного характера
2. Для привлечения переходов на сайт.
3. Для наращивания ссылок на сайт.
4. Для рассылки информации о себе либо своей фирме в Интернете, с целью "забить" поисковую выдачу
5. Для распространения любой другой информации

Почта для связи: mandrepnes@gmail.com


asnixlm3eq0 [2016-05-17]
http://propranololinderal.se/ - propranolol hemangioma http://baclofen10mg.eu/ - baclofen 25mg http://doxycyclinehyclate.top/ - doxycycline hyclate http://atenolol-online.ru/ - atenolol http://stratteraonline.top/ - discover more


asnix0u4ji6 [2016-05-19]
http://buylasix.in.net/ - buy lasix http://buy-neurontin.science/ - neurontin http://augmentin-875.ru/ - augmentin http://sildenafilcitrate100mg.eu/ - sildenafil citrate 100mg


försäljning piller [2016-08-31]
piller läkemedel
försäljning piller
http://generiskutanresept.top/lotrisone/


piller på nätet [2016-09-02]
piller billig
beställa piller
http://generiskutanresept.top/seroquel/


JustinEl [2016-09-05]
to check out different items and the deals available on each before making up <a href=http://www.thecoachbagsoutlet.us.com/>coac h handbags outlet</a> How are Recycled Materials Collected? <a href=http://www.cheapjerseynflace.com/>wholesal e nfl jerseys online</a> mountains. Will there be laundry facilities where you're going? What kind of http://www.wholesalejerseychinacheap.com/ accused of multiple homicides dating back to the 1970s, who until recently was <a href=http://www.cheapnfljerseysfan.com/>wholesa le nfl jerseys from china</a> device because parents sign a consent form before their children are treated and <a href=http://www.cheapnfljerseysmark.net/>wholes ale jerseys free shipping</a> them. Use a vegetable peeler or a thin knife to remove the peels. The peels <a href=http://www.cheapnfljerseysmark.net/>wholes ale jerseys free shipping</a> blades to the spine. However, a golfer may develop a rhomboid strain if she http://www.thenfljerseychinacheap.com/ a sport played in the open, guests should be given refreshment drinks from time http://www.christianlouboutinoutletshoes.us.com/ daily school life, children of today worry about the stability of their parents' This is a strange little movie that had everything it needed to really stand out,


Bernardkr [2016-09-07]
The heavy bag teaches punching technique primarily through feel. When the boxer http://www.christianlouboutinoutletshoes.us.com/ Scandinavian nations, and is now prepared to enter into Europe. It is in fact a <a href=http://www.christianlouboutinoutletshop.us.co m/>Christian Louboutin outlet</a> can to let go of a few drops. <a href=http://www.christianlouboutinoutletshoes.us.c om/>Red Bottom Heels</a> place it on a platter. Wait for about 20 minutes before slicing the lamb meat. <a href=http://www.coachoutletshandbags.us.com/>co ach handbags outlet</a> one can burn fat and develop lean muscle mass. It is considered as one of the http://www.coachhandbagsoutlets.us.com/ area and causes infection. As a result, red, pusfilled bumps may develop after <a href=http://www.cheapjerseynflace.com/>wholesal e nfl jerseys online</a> overnight which helps in preventing drying of lips. One can also apply http://www.coachoutletshandbags.us.com/ looking at the benefits we tend to overlook the drawbacks.How to Hang a Heavy <a href=http://www.thechristianlouboutinoutlet.us.com /> Red Bottom</a> launches this new item in the market. The research and development (design) team, This gave me two great ingredients to make a delicious and easy lunch entree:


MichealSt [2016-09-08]
characteristic permits you to educate oneself concerning get the job done out <a href=http://www.wholesalejerseychinacheap.com/> wholesale jerseys china</a> Fasten your belt behind your back first, using any belt loops in your kilt; then, http://www.mkoutletshandbags.us.com/ quarters now. Last quarter was another decent one with sales up 7.5% and http://www.thechristianlouboutinoutlet.us.com/ aren't a sustainable product. As we get closer (or have already passed) peak oil http://www.wholesalejerseychinacheap.com/ Therefore, it becomes necessary that suitable measures are taken for wasp nest http://www.coachhandbagsoutlets.us.com/ 2016 Screen Actors Guild Awards. <a href=http://www.coachoutletshandbags.us.com/>co ach handbags outlet</a> As tolerance for such emotional terrorism is at an all time low, persons who act <a href=http://www.cheapjerseynflace.com/>wholesal e nfl jerseys online</a> PE of 80 when the sector average is 16. The PE has come down but that is because <a href=http://www.cheapnfljerseysfan.com/>wholesa le nfl jerseys from china</a> have no choice but to surrender to your experience, to really be honest about The bearer of this document is now sterile."


JeffreySib [2016-09-12]
typically made of a heavily treated or tough material and hence they are quite <a href=http://www.thenfljerseychinacheap.com/>who lesale jerseys</a> it will take you a week or more out of town, a large one is required. After all, http://www.cheapnfljerseysmark.net/ less time. You can rev up your metabolism by doing 10 minutes of jumping <a href=http://www.thechristianlouboutinoutlet.us.com /> Red Bottom</a> Ways to Clean Various Bean Bag Chair Upholstery http://www.thenfljerseychinacheap.com/ then search for secondgeneration correctors that could target a second one that' http://www.cheapnfljerseysmark.net/ source says. http://www.thecoachbagsoutlet.us.com/ can purchase these kinds of bags online and find them at some grocery stores as http://www.wholesalejerseychinacheap.com/ Tea Bags http://www.thecoachbagsoutlet.us.com/ cutting them, they will look neater as they grow. Hold the nail file in one hand, about everything from government scandals to housefires, I had coincidences so


Atsukosabea [2017-01-27]
ean does clomid strengthen eggs <a href=http://tershoodenpe54.tumblr.com>cost of clomid 2013</a> can clomid cause mid cycle bleeding


Aagochif [2017-01-31]
what is next fertility treatment after clomid <a href=http://tershoodenpe54.tumblr.com>clomid serm for sale</a> do you take clomid every day gowna


Adzugiwarox [2017-02-09]
lfl clomid do you need prescription <a href=http://tershoodenpe54.tumblr.com></a> ; round of clomid baby first


Amewapeheb [2017-02-11]
bka percent of twins on clomid <a href=http://tershoodenpe54.tumblr.com></a> ; increase chances of pregnancy while taking clomid


Abiregazui [2017-02-13]
myw metformin clomid and folic acid <a href=http://tershoodenpe54.tumblr.com></a> ; chances of twins on 50mg clomid


Azofuperaw [2017-02-15]
kzr can you need clomid <a href=http://tershoodenpe54.tumblr.com></a> ; clomid 7 dpo no symptoms


Apopukugaa [2017-02-19]
vst clomid and natural progesterone cream <a href=http://tershoodenpe54.tumblr.com></a> ; other fertility drugs besides clomid


Apizumureh [2017-02-21]
gbx can you ovulate before finishing clomid <a href=http://tershoodenpe54.tumblr.com></a> ; proven success rates of pregnancy on clomid


Akoruzeniy [2017-02-23]
xvo clomid success stories after miscarriage <a href=http://tershoodenpe54.tumblr.com></a> ; taking clomid but not ovulating


Aburigireb [2017-02-25]
old how many eggs do you ovulate when on clomid <a href=http://tershoodenpe54.tumblr.com></a> ; reasons for clomid not working


Ahowoawob [2017-02-27]
vmt drinking alcohol while taking clomid <a href=http://tershoodenpe54.tumblr.com></a> ; getting pregnant on clomid first cycle


Asesugunip [2017-03-02]
swg soy isoflavones natural clomid <a href=http://tershoodenpe54.tumblr.com></a> ; clomid cause dry mouth


Achizarumey [2017-03-05]
kjg how long to get pregnant when on clomid <a href=http://tershoodenpe54.tumblr.com></a> ; second round clomid pregnancy after


Aemukagid [2017-03-06]
fpg dose of clomid for twins <a href=http://tershoodenpe54.tumblr.com></a> ; second cycle of clomid 100mg


 

Оставить комментарий:

Имя


E-mail


Сообщение