Есть ли название для этой конкретной конструкции? - PullRequest
1 голос
/ 14 февраля 2011

Например:

function foo() {
    var bar = this.bar = function () {
        return "bar";
    };
    this.mybar = function () {
        return bar();
    }
}
var myFoo = new foo();
myFoo.bar = function() {
    return "notbar";
};
myFoo.bar(); // returns 'notbar'
myFoo.mybar(); // returns "bar"

По сути, он допускает закрытый внутренний метод с возможностью перезаписи только для внешнего доступа. Таким образом, ссылка на исходную функцию никогда не изменяется, для ссылок на эту функцию в замыкании. Но экземпляры объекта замыкания могут перезаписать эту функцию, не нарушая функциональности объекта.

Есть ли название для этой конкретной конструкции, и даже полезно ли это?

1 Ответ

3 голосов
/ 14 февраля 2011

Если вы ссылаетесь на присвоение функции локальной переменной и использование этой функции в другом публичном методе, то да, это будет некая форма инкапсуляции данных . Кроме того, я бы сказал, что для этого нет особого названия.
var bar является локальной переменной для функции, а this.bar является свойством нового объекта. Переменная и свойство имеют одно и то же имя, но они не связаны между собой.

Это полезно только в том случае, если вы хотите сделать функцию в bar общедоступной и обеспечить правильную работу другой функции, если общедоступная bar перезаписана.

Так что это какая-то форма защиты других функций, но это не специальный шаблон, позволяющий внешнюю перезапись.

Если бы единственная цель this.bar была перезаписана, то вы бы достигли того же с помощью:

function foo() {
    var bar = function () {
        return "bar";
    };
    this.mybar = function () {
        return bar();
    }
}
var myFoo = new foo();
myFoo.bar = function() {
    return "notbar";
};
myFoo.bar(); // returns 'notbar'
myFoo.mybar(); // returns "bar"

Конечно, если вы вызовете myFoo.bar() до того, как назначите ей функцию, вы получите ошибку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...