我一直在努力进一步理解
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不是一个函数.
我错过了什么?
最佳答案
i find that namespace.ex2.method1 is not a function.
正确.在JavaScript中,您不直接将原型分配给对象(尽管这已经成为可能,因为the new 5th edition被采用;见下文).而是在构造函数上设置原型,然后将其分配给由这些函数构造的对象.所以,如果你做了
var obj = new namespace.ex2();
obj.method1();
…你会找到这个方法. (虽然你没有理由不能调用namespace.ex2.prototype.method1();如果你愿意的话.)
这种间接方法对于原型语言来说有点不寻常. ECMAscript第5版确实引入了一种创建对象并直接设置其原型的方法(Object.create),但这是该语言的一个相当新的补充.
有关原型,“方法”,设置原型链等的更多信息,您可能会发现this article by Crockford和this rather lesser(但也许更为熟悉,而且肯定是实用的)是您真正有趣的阅读.