在 Three.js 继承模式中对原型使用扩展有什么好处?

2024-02-20

使用优秀的 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 () {...}(),
    ...
}

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

Edit

代码示例是同一文件的一部分,请参阅https://github.com/mrdoob/ Three.js/blob/master/src/math/Vector3.js 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 () {...}(),
...
};

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

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

正如您可以在责怪观 https://github.com/mrdoob/three.js/blame/master/src/math/Vector3.js,@mrdoob 引入了这个奇怪的东西修订版cc57273 https://github.com/mrdoob/three.js/commit/cc57273cf4ae579f5dd638aed213e7aadf161f26。提交消息说:

恢复到 Object.prototype = { 模式。仅在 真正需要它的方法。

在项目上使用最新版本的lib时很神秘 我正在处理我收到此错误:

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

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

这正在恢复提交 e2df06e https://github.com/mrdoob/three.js/commit/e2df06e005e01312159167b10cff100f68d68ed2通过 @bhouston 在哪里extend被介绍:

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Three.js 继承模式中对原型使用扩展有什么好处? 的相关文章