Зачем использовать глобальные функции внутри функций прототипа JavaScript? - PullRequest
1 голос
/ 09 февраля 2012

Я пришел из ООП Java / C ++ и пытаюсь понять, что такое объектно-ориентированное программирование на JavaScript.Я искал источник для небольшого каркаса и заметил кое-что, что я нашел странным.Каркас определяет некоторые глобальные функции, а затем вызывает эти функции из функций объекта.Чтобы уточнить, вот пример:

var MyObject = function() {

    function MyObject() {
        this.x = 5;
    }

    MyObject.prototype.getX = function() {
        return _MyObjectGetX( this );
    };

    return MyObject;
}();

var _MyObjectGetX = function( myObject ) {
    return myObject.x;
};

Что я не понимаю, так это использование глобальной функции.Давайте предположим, что глобальная функция используется только в одном месте: MyObject.getX ().Почему бы просто не переместить возврат в тело функции?Это нормально:

var MyObject = function() {

    function MyObject() {
        this.x = 5;
    }

    MyObject.prototype.getX = function() {
        return this.x;
    };

    return MyObject;
}();

Эта структура была написана на CoffeeScript, а затем переведена на JavaScript.Это то, что CoffeeScript делает, что может быть ненужным, или я совершенно не понимаю, как JavaScript обрабатывает функции и объекты (точнее, функции как объекты)?

Ответы [ 2 ]

2 голосов
/ 09 февраля 2012

РЕДАКТИРОВАТЬ: извините, неправильно прочитал ваш вопрос.

В этом случае кажется, что coffeescript просто тупит ... вроде как wysiwyg генерирует html.

var MyObject = function() {    
    function MyObject() {
        this.x = 5;
    }

    MyObject.prototype.getX = function() {
        return _MyObjectGetX( this ); // referencing a closure
    };

    return MyObject;
}();

var _MyObjectGetX = function( myObject ) {
    return myObject.x;
};

действительно не имеет никакого преимущества перед более простым

        var MyObject = function() {
            this.x = 5;
        };

        MyObject.prototype.getX = function() {
            return this.x;
        };

И внешняя функция-получатель, используемая в верхнем примере coffeescript, похоже, не имеет выгоды от простого возврата. На самом деле ни один из них, по-видимому, не имеет законного использования для геттера, поскольку инкапсуляция не предоставляется. Свойство x легко доступно (и модифицируется) для объекта независимо от того, куда оно передано.

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

2 голосов
/ 09 февраля 2012

Это похоже на оптимизацию компилятора, возможно, в результате перевода CoffeeScript.

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

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