Добавить метод с параметрами в объект JavaScript - PullRequest
2 голосов
/ 21 сентября 2011

В настоящее время я занимаюсь портированием одной из моих игр с Java-апплетами на javascript + html5. Я никогда раньше не делал объектно-ориентированный javascript, и этот ОО, основанный на прототипах, меня сильно смущает.

Я пытался сделать простой порт из Java, но у меня проблемы с выполнением двух вещей:

1) Как запустить функцию внутри конструктора?
2) Как добавить метод с параметром?

Вот пример кода:

function User()
{
    setupStats();// I wanted to put some of the variable initializations into
    // a separate function for code modularity reasons.

    this.name='bob';

    //However that doesn't seem to work
    alert(this.gold); // gets Undefined

    alert(this.name); // gets bob. Phew at least this works

    //I also want to add a method with a parameter in it:
    this.draw=function(ctx){drawUser(ctx);};
}

function setupStats()
{
    this.gold=2;
    this.exp=3;
    this.blah='blah';
    this.that='something else';
    this.superultraomg='insert some computation';
}

function drawUser(ctx)
{
    ctx.drawImage(blah,blah,blah);
    alert(ctx); // Also gets undefined. Uh oh...

    alert(this.name); //Undefined? WHAT IS THIS I DONT EVEN...
}

Пожалуйста, помогите, ребята!

Ответы [ 4 ]

4 голосов
/ 21 сентября 2011

Пример

Мы используем прототип, чтобы разделить значения по умолчанию в setupStats со всеми Users. Мы используем вызов для передачи контекста, являющийся объектом User и parameter;

function User()
{
    setupStats();// I wanted to put some of the variable initializations into
    // a separate function for code modularity reasons.

    this.name='bob';

    //However that doesn't seem to work
    alert(this.gold); // gets Undefined

    alert(this.name); // gets bob. Phew at least this works

    //I also want to add a method with a parameter in it:
    this.draw= function(ctx){ drawUser.call(this, ctx); };
}

function setupStats()
{
    this.gold=2;
    this.exp=3;
    this.blah='blah';
    this.that='something else';
    this.superultraomg='insert some computation';
}

User.prototype = new setupStats();

new User().draw('pinky');

function drawUser(ctx)
{
    //ctx.drawImage(blah,blah,blah);
    alert(ctx); // Also gets undefined. Uh oh...

    alert(this.name); //Undefined? WHAT IS THIS I DONT EVEN...
}
3 голосов
/ 21 сентября 2011

Вы не слишком далеко.Проблема в основном в том, что вы используете ключевое слово "this".

Вы хотите что-то более похожее на:

    var user = {};

    var user.setupStats = function ()
    {
        this.gold=2;
        this.exp=3;
        this.blah='blah';
        this.that='something else';
        this.superultraomg='insert some computation';
    };

    var user.init = function ()
    {
         this.name='bob';

         //Setup the stats
         this.setupStats();

         //However that doesn't seem to work
         alert(this.gold); // gets Undefined

         alert(this.name); // gets bob. Phew at least this works

         //I also want to add a method with a parameter in it:
         this.draw=function(ctx){drawUser(ctx);};
     };

Вы бы продолжили этот подход и выполняли вызовы против него, выполняя такие действия, как

user.init();

, которая автоматически объединит ваши ссылки на функции.

0 голосов
/ 21 сентября 2011

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

ctx не определен в drawUser (), потому чтопараметры объявлены неправильно.Параметры Javascrpit должны рассматриваться как (примечание, они не принимают ключевое слово var):

function methodName( aParam : aParamType, bParam : bParamType) {}

классы объявляются с использованием ключевого слова class [необязательно, опускаются квадратные скобки]

[private public static] class ClassName [extends ParentClass] { /*methods here*/ }

hopeэто помогает.

0 голосов
/ 21 сентября 2011

Я рекомендую прочитать JavaScript: самый недопонимаемый в мире язык программирования Дугласа Крокфорда.Он четко объясняет, как классы, частные члены, открытые члены, наследование и т. Д. Выполняются в JavaScript.

...