【问题标题】:Google Closure Library inherits propertiesGoogle Closure Library 继承属性
【发布时间】:2013-05-16 22:51:09
【问题描述】:

我正在试验 Google 闭包库,尤其是它的“继承”方法。

我有一个问题。当我扩展一个基类时,如果我没有在它的构造函数中设置基类的属性,那么所有的子类最终都会共享这些属性,例如,如果我将项目添加到数组中,那么数组只会变得越来越大。

有人能解释一下为什么我需要在构造函数中设置属性吗?

这是我的示例,如果您注释掉“this.list = [9,8,7];”在 'Person' 构造函数中,孩子们共享人员列表并不断添加。

http://jsbin.com/imujoy/1/edit

感谢您的帮助。

【问题讨论】:

    标签: javascript inheritance google-closure


    【解决方案1】:

    当您从子级引用“this.list”时,它首先查看对象本身以查找该属性。当它找不到它时,它会查看它的原型并找到“列表”数组。但是,该列表是对您在 Person 原型上创建的相同列表的引用。如果您在构造函数中分配一个新的“this.list”,那么您只是在对象上分配了一个属性,而不是原型。一般来说,如果您打算使用继承模型,则不应在原型上分配非原始类型(数组、对象),因为子级将共享相同的引用。

    【讨论】:

    • 当您设置默认值时,分配可能重新分配的原型值属性的一个很好的例子是: Man.property.hands=2 Man 的所有实例及其子类将有 2 只手,但您可以更改以 JerryHandy 为例,他在电锯上出了点小事故。
    【解决方案2】:

    您是在使用 Parent.call(this) 还是 Parent.apply 复制父级定义的变量在子级中

    function Child(){
      Parent.apply(this,arguments);
    }
    goog.inherits(Child, Parent);
    

    当在 Parent 中以下列方式定义时,list 将成为任何 Child 实例的属性:

    function Parent(){
      this.list=[];
    }
    

    基本原型行为:

    Prototypical inheritance - writing up 处理构造函数参数的良好参考,但要应用,您必须实现 _init 并更改 goog.base: How to "properly" create a custom object in JavaScript?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-02-03
      • 2012-05-08
      • 2012-08-15
      • 2010-10-05
      • 1970-01-01
      • 2015-03-27
      • 1970-01-01
      相关资源
      最近更新 更多