将Prototype设置为Object Literal与将字段添加到Prototype

时间:2014-01-21 16:33:28

标签: javascript google-closure

更新:我已更新问题,说明相关代码是针对Google Closure中的子类。

我正在查看一些定义子类的JavaScript代码,并看到正在使用对象文字来设置原型。请注意,此代码使用的是Google Closure Library,并将使用Google Closure Compiler以高级模式进行编译。 (不确定这个问题是否重要。)代码如下:

company.app.MyClass = function(param) {
  this.field = 0;
};

company.app.MyClass.prototype = {
  function1: function() {
    //Do stuff.
  },
  function2: function() {
    //Do more stuff.
  };
};

company.app.MySubClass = function(param) {
  company.app.MyClass.call(this, param);
};

company.app.MySubClass.prototype = {
  function3: function() {
    //Do stuff.
  },
  function4: function() {
    //Do more stuff.
  };
};

goog.inherits(company.app.MySubClass, company.app.MyClass);

我在使用Google Closure创建类时看到的所有示例都将字段和函数添加到原型中,而不是将其设置为具有Object文字的全新对象。因此MySubClass的代码如下所示:

company.app.MySubClass.prototype.function3 = function() {
    //Do stuff.
};
company.app.MySubClass.prototype.function4 = function() {
    //Do more stuff.
};

我不确切知道调用goog.inherit时到底发生了什么,但我想知道将子类的原型设置为新的对象文字是否会导致基类的继承问题,{ {1}}?

1 个答案:

答案 0 :(得分:2)

  

当goog.inherit被称为

时,我并不确切知道发生了什么

然后检查codegoog.inherits。如果你知道常见的Object.create垫片及其作用,它应该看起来很熟悉。

正如您所看到的,它会完全覆盖childCtor.prototype,而不会保留其上的任何旧属性 - can be problematic并确实会删除您之前的function3function4方法在你的例子中定义了它。因此,您需要首先继承,然后扩展新的原型对象。

如果您仍想使用对象文字,那没问题:

company.app.MySubClass = function(param) {
  company.app.MyClass.call(this, param);
};
goog.inherits(company.app.MySubClass, company.app.MyClass);
goog.mixin(company.app.MySubClass.prototype, {
  function3: function() {
    //Do stuff.
  },
  function4: function() {
    //Do more stuff.
  }
});