【问题标题】:Javascript namespacing/prototype issueJavascript命名空间/原型问题
【发布时间】:2011-06-03 03:03:56
【问题描述】:

我一直在努力加深对 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 不是函数。

我错过了什么?

【问题讨论】:

    标签: javascript namespaces


    【解决方案1】:

    原型适用于对象的实例:

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

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

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

    【讨论】:

      【解决方案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(但听起来可能更熟悉,当然也更实用)一本您真正有趣的读物。

      【讨论】:

        【解决方案3】:

        在之前创建实例

        var instance = new namespace.ex1;
        

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-06-16
          • 1970-01-01
          • 1970-01-01
          • 2014-07-20
          • 1970-01-01
          • 1970-01-01
          • 2011-02-05
          相关资源
          最近更新 更多