Рефакторинг структуры наследования Javascript - PullRequest
0 голосов
/ 24 мая 2011

Я боролся и взломал этот Javascript для работы:

function mmlfunc(name, evalcallback, mmlparts)
{
    this.name = name;
    // ...
}
mmlfunc.prototype.evalFunc = function()
{
    return this.evalcallback(this.args);
};
mmlfunc.prototype.getMML = function()
{
    var mml = this.mmlparts[0];
    // ...
    return mml;
}

// ...

mmlnum = jQuery.extend(true, {},
    new mmlfunc('Value',
        function() { return this.val; },
        [ '<mn>', '</mn>' ]));
mmlnum.getMML = function()
{
    return this.mmlparts[0] + this.val + this.mmlparts[1];
}

// ...
var n1 = jQuery.extend(true, {}, mmlnum),
    n2 = jQuery.extend(true, {}, mmlnum),
    n3 = jQuery.extend(true, {}, mmlnum),
    n4 = jQuery.extend(true, {}, mmlnum);

n1.val = 6;
n2.val = 7;
n3.val = 8;
n4.val = 9;

Как мне заставить new() работать на n1 - n4 вместо необходимости использовать extend()? Что еще я могу сделать, чтобы убрать этот беспорядок?

Спасибо.

Ответы [ 2 ]

1 голос
/ 24 мая 2011

Заставьте mmlnum вызвать базовый конструктор, а затем расширить prototype. Пример для jsFiddle.

function mmlnum()
{
    mmlfunc.call(this,
                 "Value",
                 function() { return this.val; },
                 [ '<mn>', '</mn>' ]);
}

jQuery.extend(true, mmlnum.prototype, mmlfunc.prototype);

А затем измените ваши переменные на

var n1 = new mmlnum(),
    n2 = new mmlnum(),
    n3 = new mmlnum(),
    n4 = new mmlnum();

n1.val = 6;
n2.val = 7;
n3.val = 8;
n4.val = 9;

Использование alert(n1.name) отобразит Value.

Наследование в MDC.

1 голос
/ 24 мая 2011

Не так уж плохо создать объект mmlnum и использовать $.extend для каждого n-var. Если они не используются, то настройка ваших n-переменных должна выглядеть примерно так:

var n1 = new mmlfunc('Value',
                     function() { return this.val; },
                     [ '<mn>', '</mn>' ])),
    n2 = new mmlfunc('Value',
                     function() { return this.val; },
                     [ '<mn>', '</mn>' ])),
    n3 = new mmlfunc('Value',
                     function() { return this.val; },
                     [ '<mn>', '</mn>' ])),
    n4 = new mmlfunc('Value',
                     function() { return this.val; },
                     [ '<mn>', '</mn>' ]));
n1.getMML = function() {
                return this.mmlparts[0] + this.val + this.mmlparts[1];
            };
n2.getMML = function() {
                return this.mmlparts[0] + this.val + this.mmlparts[1];
            };
n3.getMML = function() {
                return this.mmlparts[0] + this.val + this.mmlparts[1];
            };
n4.getMML = function() {
                return this.mmlparts[0] + this.val + this.mmlparts[1];
            };

... который менее удобочитаемый и менее СУХОЙ. Даже если до этого нужно было многое почистить, я думаю, вы должны оставить ту часть, которую вы цитировали, как есть.

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