【问题标题】:three.js inheritance pattern三.js继承模式
【发布时间】:2012-06-19 12:53:52
【问题描述】:

我想知道为什么three.js的代码是这样的结构:

THREE.Camera = function(){
    THREE.Object3D.call(this);
    //add more Camera specific properties and methods
}

THREE.Camera.prototype = new THREE.Object3D();
THREE.Camera.prototype.constructor = THREE.Camera;

THREE.Camera.prototype.//add more camera specific methods...

我想知道他们为什么在当前构造函数和原型中调用基构造函数?

在 MDN 中,他们展示了这样的模式:

subType = function(){
    //new properties for subType
}

subType.prototype = new baseType();

他们在 subType 构造函数中没有对基构造函数的调用,那为什么 THREE.js 会这样做呢?

【问题讨论】:

标签: javascript design-patterns three.js


【解决方案1】:

由于每个THREE.Object3D实例都继承自THREE.Object3D.prototype,通过这种方式设置THREE.Camera.prototype,每个THREE.Camera实例也将继承自THREE.Object3D.prototype

如果您不这样做,THREE.Camera 实例将不会继承分配给 THREE.Object3D.prototype 的任何属性。

所以,这两部分都很重要:

  • 通过适当地设置THREE.Camera.prototype,新实例将从THREE.Object3D.prototype继承,并且这些属性共享所有实例。

  • 通过调用“父”构造函数,您正在使用实例特定数据初始化每个实例。


也就是说,这样设置原型并不是最好的方法。如果THREE.Object3D 期望没有这些参数,构造函数将无法工作怎么办?

更好的方法是创建一个继承自 THREE.Object3D.prototype 的空对象,因为这就是您所需要的:

THREE.Camera.prototype = Object.create(THREE.Object3D.prototype);
THREE.Camera.prototype.constructor = THREE.Camera;

参考:Object.create

【讨论】:

  • 我同意改用 Object.create!
  • 如果您希望 Object3D 原型中的方法可用于 Camera 对象,您可以不直接将 Camera.prototype 分配给 Object3D.prototype -> THREE.Camera.prototype = THREE.Object3D.prototype 吗?为什么需要创建一个新副本呢?所以你可以在不影响原始副本的情况下添加新方法?
  • @DannyR:没错。如果您选择THREE.Camera.prototype = THREE.Object3D.prototype,那么您对THREE.Camera.prototype 所做的任何更改也会影响THREE.Object3D.prototype。这就是为什么你想要这个间接级别(我会这么称呼它)。关于您的编辑,这是我列表中的第二点。不想调用父构造函数也可以,但这样做是合理的。
  • @mrdoob: :) 我很自豪能够以某种方式为three.js 库做出贡献!我没有使用它,因为这不是我的领域,但它看起来是一个非常好的库。祝你一切顺利!
猜你喜欢
  • 2013-02-04
  • 2016-05-23
  • 1970-01-01
  • 2014-05-17
  • 1970-01-01
  • 2023-03-21
  • 2011-01-19
  • 2015-02-09
  • 2021-11-15
相关资源
最近更新 更多