Я пытался изучить закрытия (в JavaScript), который вид вреда мой мозг после слишком много лет с C# и C++. Я думаю, что у меня теперь есть основное понимание, но одна вещь беспокоит меня: я посетил много веб-сайтов в этом Quest для Знания и нигде не имею меня замеченный слово (или даже простая фраза с двумя словами), который означает "ряд закрытий JavaScript, которые совместно используют общий контекст выполнения". Например:
function CreateThingy (name, initialValue) { var myName = name; var myValue = initialValue; var retObj = new Object; retObj.getName = function() { return myName; } retObj.getValue = function() { return myValue; } retObj.setValue = function(newValue) { myValue = newValue; } return retObj; };
Из того, что я читал, это, кажется, один распространенный способ реализовать сокрытие данных. Значение, возвращенное CreateThingy, является, конечно, объектом, но что Вы назвали бы набором функций, которые являются свойствами того объекта? Каждый - закрытие, но я хотел бы имя, которое я могу используемый, чтобы описать (и думать о) все они вместе как один концептуальный объект, и я использовал бы обычно принимаемое имя, чем составил бы то.
Спасибо!
- Ed
Вы можете назвать это классом
, но это просто хеш-таблица с кучей записей, некоторые из которых являются функциями (или замыканиями). Более идиоматический способ сделать это в Javascript - использовать прототипы.
Некоторые ссылки, которые могут вам помочь:
Это близко к шаблону модуля. Используйте выражение типа:
var thingy = (function(specObj) {
var my = {},
privateVar = blah,
someOtherPrivateVar = [];
my.getSomeVal() {
return specObj.someVal;
}
my.getAnotherVal() {
return specObj.AnotherVal;
}
}({
someVal: "value",
anotherVal: "foo"
}));
Я инициализировал с помощью объектного литерала, потому что использование именованного объекта позволило бы изменить состояние тонкой штуки, изменив именованный объект. Есть и другие возможности сделать это.
Вот еще одна хорошая ссылка о вариациях шаблона модуля: http://www.adequatelygood.com/2010/3/JavaScript-Module-Pattern-In-Depth
Почти само собой разумеется, но книга Крокфорда Javascript: The Good Parts содержит хорошее описание этого стиля и его конкретных преимуществ.
Крокфорд популяризировал термин « привилегированный метод » для обозначения функций, которые имеют доступ к области его конструктора (где объявлены частные члены).
Я бы назвал их «Набор функций JavaScript, которые имеют общую охватывающую область видимости» .
Часть «контекст выполнения» фразы, которую вы публикуете, может создать путаницу между контекстами выполнения , описанными в спецификации, значением this
, которое также широко известен как «контекст функции» или «контекст объекта» , и область действия функции, на которую в действительности ссылаются здесь.