Что Вы называете рядом закрытий JavaScript, которые совместно используют общий контекст?

Я пытался изучить закрытия (в 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

5
задан Edward L. Stauff 12 June 2010 в 20:04
поделиться

3 ответа

Вы можете назвать это классом , но это просто хеш-таблица с кучей записей, некоторые из которых являются функциями (или замыканиями). Более идиоматический способ сделать это в Javascript - использовать прототипы.

Некоторые ссылки, которые могут вам помочь:

1
ответ дан 15 December 2019 в 00:50
поделиться

Это близко к шаблону модуля. Используйте выражение типа:

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 содержит хорошее описание этого стиля и его конкретных преимуществ.

0
ответ дан 15 December 2019 в 00:50
поделиться

Крокфорд популяризировал термин « привилегированный метод » для обозначения функций, которые имеют доступ к области его конструктора (где объявлены частные члены).

Я бы назвал их «Набор функций JavaScript, которые имеют общую охватывающую область видимости» .

Часть «контекст выполнения» фразы, которую вы публикуете, может создать путаницу между контекстами выполнения , описанными в спецификации, значением this , которое также широко известен как «контекст функции» или «контекст объекта» , и область действия функции, на которую в действительности ссылаются здесь.

3
ответ дан 15 December 2019 в 00:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: