Javascript命名空间/原型问题

我一直试图进一步了解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不是一个函数。

我错过了什么?


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

正确。 在JavaScript中,您不会直接将对象分配给对象(尽管随着新版本的第5版的采用,这已成为可能;请参见下文)。 相反,您可以在构造函数上设置原型,然后将这些原型分配给由这些函数构造的对象。 所以,如果你已经完成了

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

...你会找到方法。 (虽然没有理由不能调用namespace.ex2.prototype.method1();如果你想。)

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

关于原型,“方法”,建立原型链等的更多信息,你可能会发现这篇由Crockford撰写的文章,而这篇文章相对较少(但也许更熟悉,听起来也很务实),真正有趣的是你的阅读。


之前创建实例

var instance = new namespace.ex1;

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


原型适用于对象的实例:

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

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

var foo = function() {};
foo.a = function() {};
foo.a();
链接地址: http://www.djcxy.com/p/17041.html

上一篇: Javascript namespacing/prototype issue

下一篇: Advice needed... Javascript OOP/namespacing