使用优秀的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 () {...}(),
...
};
答案 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
:
将三个错过的转化修复为关闭。切换到扩展数学 原型而不是替换它们。这是为了确保类型 在类型的原型定义中的闭包中创建它们 用完整定义更新原型。