0

在“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,但这是另一回事。

4

1 回答 1

0

调用构造函数可能是为了兼容性。 Object.create()是 JavaScript 的一个相对较新的补充,在 ECMAScript 5 发布之前发布的一些浏览器(例如 IE8 和 IE7)不支持。仅仅调用另一个对象的构造函数是不足以让该对象继承另一个对象的原型(demo)。避免调用父对象的构造函数当然有好处,但是否Object.create()“更整洁”是有争议的。

于 2012-10-10T23:38:17.037 回答