Имитация ООП-конструкторов на основе классов в Javascript - PullRequest
0 голосов
/ 29 сентября 2011

Краткое примечание: ООП в Javascript - это тема, которая избита до смерти в Stackoverflow и в других местах, но я не могу найти этот конкретный вопрос, где бы он ни находился.

«Висячий код» вJavascript объекты всегда беспокоили меня, так как кажется, что это нарушает поток кода.Под «зависшим кодом» я подразумеваю следующее:

function newObject()
{
    var thisObject = this;

    // HANGING CODE DOING VARIOUS THINGS SUCH AS
    // $('#someDiv').click(function(){}); OR
    // var someObjectLiteral = {value:'value'};
}

Я хотел имитировать конструкторы ООП на основе классов, выполняя следующие действия:

function newObject()
{
    var thisObject = this;

    function construct()
    {
        //WHAT USED TO BE HANGING CODE
    }

    construct();
}

Верно ли любое из следующегоили, скорее всего, верно в отношении второй методологии:

  1. Это значительно медленнее
  2. Это просто не будет работать вообще в определенных ситуациях
  3. Это нарушает правильную практику кодирования
  4. Отладка будет сложнее
  5. Существует превосходная методика для достижения того же результата

Спасибо.

Ответы [ 2 ]

2 голосов
/ 29 сентября 2011

Нет ничего плохого в том, чтобы оборачивать код внутри внутренней функции.Единственное, на что вам следует обратить внимание, это то, что вы не можете использовать this внутри других функций (вам нужно использовать промежуточную переменную, такую ​​как yout thisObject.

. Я не вижу никакой проблемы с «зависшим кодом» (по крайней мере, в том виде, который показан в вашем примере). Язык, такой как Java, может научить вас помещать все в классно в Javascript вам действительно нужно избегать проблем в тех случаях, когда вы явно хотите воспользоваться преимуществами наследования или полиморфизма.

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

1 голос
/ 29 сентября 2011

Вы можете использовать что-то вроде MooTools Class , который будет медленнее, чем ваш метод с «зависшим» кодом. В основном это связано с тем, что класс MooTools имеет служебную информацию, связанную с их «нативной» структурой. Многое, что вам может и не понадобиться, и, скорее всего, не понадобится Похоже, вы хотите что-то прямо в точку.

Вы можете сделать что-то вроде:

var Klass = function(attrs) {
    var key, newClass;

    attrs = attrs || {};

    newClass = function() {
        if(this.init) {
            this.init.apply(this, Array.prototype.slice.call(arguments));
        }
    };

    for(key in attrs) {
        newClass.prototype[key] = attrs[key]
    }

    return newClass;
};

Тогда вы можете сделать что-то вроде:

var Person = new Klass({
    init: function(name, bg) {
        this.name = name;
        document.getElementById('container').styles.background = bg;
    },

    speak: function() {
        'I am ' + this.name;
    }
});

var tim = new Person('tim', 'blue');
// background now blue
tim.speak();
// 'I am tim'

var jane = new Person('jane', 'purple');
// background now purple
jane.speak();
// 'I am jane'

Итак, этот код будет запускать init (), когда вы создаете новый экземпляр класса. Передав это какими-то аргументами. В котором вы можете поместить свой «висячий» код. Узел, который из-за того, как работают прототипы, не позволяет создавать новый экземпляр нового экземпляра. И вам нужно будет изменить его дальше, чтобы учесть такие вещи, как создание родительского класса. Но это довольно простой способ построения структуры классов.

Это должно хорошо работать для того, что вы хотите. Если вы столкнетесь с чем-то, что «не может», то наверняка найдется способ исправить это. Возможно, вам просто нужно найти код. Как я уже говорил в предыдущем абзаце. Будут небольшие накладные расходы, поскольку класс - это в основном возвращаемая функция, для которой вы затем создаете новый экземпляр. Но ничего особенного. Что касается лучших практик, я бы сказал, что это неплохо. Существует ряд библиотек JS, которые имеют достаточно обширную структуру классов для использования. И многие люди используют классы. Но есть и будут аргументы по поводу их использования, поскольку они не являются настоящими нативными типами JS.

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