无法复制THREE.Vector3

时间:2015-07-06 13:38:24

标签: javascript inheritance three.js

我认为我的问题更多是javascript继承问题,而不是Three.js问题。

我对javascript中的继承不太熟悉,所以经过一些教程后,我想出了this snippet,我无法弄清楚为什么它没有达到我的预期。

var MyClass = function() {

    THREE.PerspectiveCamera.apply(this, arguments);   

    // Here this.position is default value, (0,0,0)

    this.position = new THREE.Vector3(1,2,3);

    // this.position is unchanged, like if 
    // the previous affectation didn't do anything

}

MyClass.prototype = Object.create(THREE.PerspectiveCamera.prototype);
MyClass.prototype.constructor = MyClass;

var obj = new MyClass();

如果我删除继承,这就是我期望它做的事情,而且我不能用Three.js对象以外的东西重现它。

我可能会遗漏一些东西,但我看不清楚。

你有什么想法吗?

谢谢!

2 个答案:

答案 0 :(得分:4)

javascript支持继承的方式非常复杂,如果你不想编写代码,你和你的伙伴几个月后就无法阅读,那么你应该考虑另一种方法来解决你的问题

我想到了THREE.PerspectiveCamera.prototype周围的包装器构造函数:

var MyClass = function () {
    this.perspectiveCamera = new THREE.PerspectiveCamera(arguments);
    this.perspectiveCamera.position = new THREE.Vector3(1, 2, 3);
}

var instance = new MyClass();

这应该可以解决问题。

但是如果你对原型概念感兴趣,这里有一些有用的知识:

  • 将结构实例传递给原型意味着该原型的所有实例都将引用结构的同一实例

  • 你永远不应该将原型设置为另一个原型的实例,因为这最终会包含一些结构(见上文)

  • 最好的方法是遍历旧原型的所有成员(recursivly)并将它们克隆到新原型。

进一步了解的一些链接:

https://developer.mozilla.org/de/docs/Web/JavaScript/Inheritance_and_the_prototype_chain

http://snook.ca/archives/javascript/javascript_pass

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Introduction_to_Object-Oriented_JavaScript

答案 1 :(得分:2)

您无法正如您所做的那样为对象定位新的Public Sub remove_blank() Dim arrayValue() As Variant ThisWorkbook.Sheets("Sheet1").Activate ' Sheet1 has the data with blanks arrayValue = range("A1:H2") ' Range where the data present... Dim i As Long Dim j As Long Dim x As Integer: x = 1 Dim y As Integer: y = 1 For i = 1 To UBound(arrayValue, 1) For j = 1 To UBound(arrayValue, 2) Dim sStr As String: sStr = arrayValue(i, j) If (Len(Trim(sStr)) <> 0) Then ThisWorkbook.Sheets("Sheet2").Cells(x, y).Value = sStr ' Sheet2 is the destination y = y + 1 End If Next j x = x + 1 y = 1 Next i End Sub

THREE.Vector3

正如this answer中所述,Object3D&#39; this.position = new THREE.Vector3( 1, 2, 3 ); positionrotationquaternion属性是不可变的。请改用scale方法。

set()

three.js r.71