Пространство имен Javascript / проблема с прототипом - PullRequest
4 голосов
/ 04 января 2011

Я пытался углубить свое понимание пространства имен javascript и наследования прототипов, но столкнулся с проблемой.

Пример того, что я имею дело с кодом:

var namespace = {
    ex1: function () { },
    ex2: function () {
        this.exvar1 = 0,
        this.exvar2 = 0;
    }
}

namespace.ex1.prototype = {
    method1: function () {

    },

    method2: function () {

    }
};

namespace.ex2.prototype = {
    method1: function () {
        alert("ex2.method1" + typeof this.method1);
    },

    method2: function () {
        alert("ex2.method2" + typeof this.method2); 
    }
};

если я тогда попытаюсь вызвать метод, выполнив:

namespace.ex2.method1();

Я считаю, что namespace.ex2.method1 не является функцией.

Чего мне не хватает?

Ответы [ 3 ]

2 голосов
/ 04 января 2011

Я считаю, что namespace.ex2.method1 не является функцией.

Правильно.В JavaScript вы не напрямую не присваиваете прототипы объектам (хотя это становится возможным по мере принятия нового 5-го издания ; см. Ниже).Вместо этого вы устанавливаете прототипы в функциях конструктора, которые затем назначаются объектам, созданным этими функциями.Итак, если бы вы сделали

var obj = new namespace.ex2();
obj.method1();

... вы бы нашли метод.(Хотя нет причин, по которым вы не можете позвонить namespace.ex2.prototype.method1();, если хотите.)

Этот косвенный подход несколько необычен для прототипного языка.ECMAscript 5-е издание действительно представляет средства создания объекта и установки его прототипа напрямую (Object.create), но это довольно новое дополнение к языку.

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

0 голосов
/ 04 января 2011

Прототипы применяются к экземплярам объектов:

var foo = function() {};
foo.prototype = {
    a: function() {}
}
var instance = new foo;
instance.a();

Чтобы поместить функцию непосредственно в объект (а не в его прототип), сделайте следующее:

var foo = function() {};
foo.a = function() {};
foo.a();
0 голосов
/ 04 января 2011

создать экземпляр до

var instance = new namespace.ex1;

попробуйте здесь http://jsfiddle.net/quWPC/

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