Рассмотрим следующий код:
function Dog()
{
this.foo = function() {};
this.walk = function()
{
if(canWalk())
{
alert('walking');
return;
}
alert('I have no legs!');
}
canWalk = function()
{
this.foo();
return false;
}
}
var instance = new Dog();
instance.walk();
В этом коде есть ошибка с «привилегированным» методом canWalk()
, предполагающим, что указатель this
указывает на экземпляр Dog
. Похоже, он указывает на глобальный объект, который меня смущает! Я читал, что из-за замыканий я могу получить ссылку на this
в области конструктора, а затем использовать эту ссылку в моем «привилегированном» методе, но это похоже на взлом.
Я едва понимаю поведение указателя this
в различных контекстах. Я понимаю, что метод, который «присоединен» к объекту, получит this
, указывающий на присоединенный объект. Например, foo.doStuff()
будет иметь this
, указывающий на экземпляр foo
.
Что беспокоит, так это то, что, хотя я думаю, что я умен и создаю «привилегированные» методы для своего ОБЪЕКТА, похоже, что Я ДЕЙСТВИТЕЛЬНО сбрасываю функции в глобальный контекст! Возможно, существовал глобальный метод под названием init()
(вполне возможно) из другой библиотеки или файла, не моего собственного создания. Если бы я затем определил симпатичный маленький инкапсулированный объект с помощью «привилегированного» метода с именем init()
, я бы заменил другой глобальный метод init()
.
Мой вопрос: каков наилучший способ создания "привилегированных" методов (и полей в этом отношении), которые ограничены объектом, которому они должны принадлежать? Какой другой подход к моему образцу объекта предоставил бы приватные или привилегированные методы, в то же время будучи должным образом ограниченным. Я не ищу неясные решения, которые отвечают требованиям, а скорее лучшую практику.