在“WebGL - Up and Running”一书中,以一种非常平淡的方式构建了一个自定义几何图形。然而,倒数第二行代码让我大吃一惊。代码如下:
Saturn.Rings = function ( innerRadius, outerRadius, nSegments ) {
THREE.Geometry.call( this );
var outerRadius = outerRadius || 1,
...snip snip snip...
this.computeCentroids();
this.computeFaceNormals();
this.boundinSphere = { radius: outerRadius };
};
Saturn.Rings.prototype = new THREE.Geometry();
Saturn.Rings.prototype.constructor = Saturn.Rings;
我的问题是:他为什么在原型链中使用构造函数实例?为什么不能Saturn.Rings.prototype
只是继承自的新空白对象THREE.Geometry.prototype
?不应该把所有值得继承的东西都放在里面THREE.Geometry.prototype
吗?为什么他让原型成为几何构造函数的实例?(我知道原型链仍然是正确的,因为新原型继承自THREE.Geometry
的原型)。
此外,在上面代码的第二行中,实例Saturn.Rings
被放入THREE.Geometry
构造函数中。THREE.Geometry
因此,他们从施工过程中得到了他们梦寐以求的一切。因此,没有必要对他们的原型做同样的事情。
让我们看一下three.js本身是如何处理类似几何的:
THREE.CubeGeometry = function ( width, height, depth, segmentsWidth, segmentsHeight, segmentsDepth, materials, sides ) {
THREE.Geometry.call( this );
...snip snip snip...
}
this.computeCentroids();
this.mergeVertices();
};
THREE.CubeGeometry.prototype = Object.create( THREE.Geometry.prototype );
整齐多了。唯一的问题是他忘记将原型的“构造函数”属性设置为指向THREE.CubeGeometry
,但这是另一回事。