在three.js继承模式中对原型使用extend有什么好处?

时间:2014-02-03 17:37:02

标签: javascript three.js

使用优秀的Three.js框架并且目前正在寻找一个良好的javascript继承模式,我看看在Three.js中做了什么。 我现在对正在发生的事情有了很好的理解,除了一些像“Vector3”这样的“类”。

特别是,我不清楚为什么有些方法直接添加到原型中,有些方法是使用THREE.extend在相同的“类”中添加的,如下所示:

...
THREE.Vector3.prototype = {
    setX: function ( x ) {
         this.x = x;
         return this;

    },
...
};

//and then later in the same file 
THREE.extend( THREE.Vector3.prototype, {
    applyEuler: function () {...}(),
    ...
}

使用扩展有什么好处,而有可能扩充原型对象?

修改

代码示例是同一文件的一部分,请参阅https://github.com/mrdoob/three.js/blob/master/src/math/Vector3.js 我不是在问这两个部分之间有什么区别,而是为什么在定义原型之后才使用extend。 换句话说(使用之前的摘录),为什么不写:

...
THREE.Vector3.prototype = {
    setX: function ( x ) {
         this.x = x;
         return this;

    },
    applyEuler: function () {...}(),
...
};

1 个答案:

答案 0 :(得分:4)

  

为什么有些方法直接添加到原型中,有些方法是使用THREE.extend

添加的

说真的,这没有任何意义。

正如你在blame view中可以看到的那样,@ mddoob用revision cc57273引入了这种奇怪之处。提交消息说:

  

恢复为Object.prototype = {pattern。只在它上面使用它   真正需要它的方法。

     

在项目中使用最新版本的lib时很神奇   我正在努力,我收到了这个错误:

> Uncaught TypeError: Object [object Object] has no method 'set'
     

这是在THREE.UniformsLib.common.diffuse初始化时引起的   THREE.Color(THREE.Color.set()似乎未定义)。对于一些   原因只有当我在three.js之前加载Box2D时才会发生这种情况。如果我加载   之后一切都很好。但这也解决了这个问题。

这是由@bhouston恢复commit e2df06e,其中引入了extend

  

将三个错过的转化修复为关闭。切换到扩展数学   原型而不是替换它们。这是为了确保类型   在类型的原型定义中的闭包中创建它们   用完整定义更新原型。