Javascript 命名空间/原型问题

4

我一直在努力深入了解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
我发现 namespace.ex2.method1 不是一个函数。
正确。在JavaScript中,您不会直接将原型分配给对象(虽然随着新的第五版的采用,这变得可能;请参见下文)。相反,您在构造函数上设置原型,然后将这些构造函数分配给由这些函数构造的对象。因此,如果您执行了以下操作:
var obj = new namespace.ex2();
obj.method1();

...你会找到方法的。(尽管如果你想的话,也没有理由不能调用 namespace.ex2.prototype.method1();。)

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

关于原型、"方法"、设置原型链等更多信息,您可能会发现Crockford的this article by Crockford和我自己写的this rather lesser(但也许更熟悉、更实用)有趣的阅读。


0

原型适用于对象的实例:

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

将一个函数直接放在对象内部(而不是在其原型中),请按照以下步骤操作:
var foo = function() {};
foo.a = function() {};
foo.a();

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接