three.js继承模式

Dan*_*son 5 javascript design-patterns three.js

我想知道为什么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...
Run Code Online (Sandbox Code Playgroud)

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

在MDN中,它们显示如下模式:

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

subType.prototype = new baseType();
Run Code Online (Sandbox Code Playgroud)

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

Fel*_*ing 7

由于每个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;
Run Code Online (Sandbox Code Playgroud)

参考: Object.create

  • 仅供参考:https://github.com/mrdoob/third.js/commit/cdfc4f3b8adc635e1a635ab12250c71141f95e9d ^^ (2认同)