Javascript命名空间/原型问题

时间:2011-01-03 23:32:52

标签: javascript namespaces

我一直在努力进一步理解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 个答案:

答案 0 :(得分:2)

  

我发现namespace.ex2.method1不是函数。

正确。在JavaScript中,你没有直接将原型分配给对象(尽管随着the new 5th edition被采用,这种情况变得可能;见下文)。而是在构造函数上设置原型,然后将其分配给由这些函数构造的对象。所以,如果你已经完成了

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

...你会找到这个方法。 (虽然如果你愿意,你没有理由不能打电话给namespace.ex2.prototype.method1();。)

这种间接方法对于原型语言来说有点不寻常。 ECMAscript第5版确实介绍了一种创建对象并直接设置其原型 Object.create)的方法,但这是该语言的一个相当新的补充。

有关原型,“方法”,设置原型链等的更多信息,您可能会发现this article by Crockfordthis rather lesser(但也许更熟悉,听起来更加务实)有趣的阅​​读。

答案 1 :(得分:0)

之前创建实例
var instance = new namespace.ex1;

在这里试试http://jsfiddle.net/quWPC/

答案 2 :(得分:0)

原型适用于对象的实例:

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

要将函数直接放在对象(而不是原型)中,请执行以下操作:

var foo = function() {};
foo.a = function() {};
foo.a();