Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 继承和“TypeError:无法读取未定义的属性'someProperty'_Javascript - Fatal编程技术网

Javascript 继承和“TypeError:无法读取未定义的属性'someProperty'

Javascript 继承和“TypeError:无法读取未定义的属性'someProperty',javascript,Javascript,问题:当继承对象的属性和方法时,子对象似乎与父对象的“this”失去了连接。为了更好地说明这一点,请看我的示例: function RigidBody() { this.local = new Matrix4x3(); this.position = new vec3(); ... } RigidBody.prototype = { ... setPosition: function(vec) { this.position.copy(v

问题:当继承对象的属性和方法时,子对象似乎与父对象的“this”失去了连接。为了更好地说明这一点,请看我的示例:

function RigidBody() {
    this.local = new Matrix4x3();
    this.position = new vec3();
    ...
}

RigidBody.prototype = {
    ...
    setPosition: function(vec) {
        this.position.copy(vec);
        this.local.setTranslation(this.position);
    }
    ...
};

CameraObject.prototype = new RigidBody();
CameraObject.prototype.constructor = CameraObject;

function CameraObject() {
    this.fov = ...
}

CameraObject.prototype.add = ...;

var camera = new CameraObject();
camera.add(...); // Works fine;
camera.setTranslation(...); // Throws "TypeError: Cannot read property 'setTranslation' of undefined
// And on another PC it throws: "http://localhost:8080/js/rigidBody.js(61): Uncaught exception: TypeError: Cannot convert 'this.local' to object"

如何绕过它?我通过分配this找到了解决此问题的方法。this=this;将每个this替换为this.this。不幸的是,作为结果,我需要添加。这个到每个摄像头函数调用中,就像这样:camera.this.setPosition

您需要调用super,换句话说,从父构造函数继承属性:

function CameraObject() {
    RigidBody.call(this); // inherit RigidBody properties
    this.fov = ...
}

作为一般建议,我强烈建议您将console.logcamera添加到代码中,并在良好的浏览器控制台中检查对象

这样,您就可以探索摄影机对象可用的特性和嵌套特性

从原始问题中的代码示例来看,setTranslation似乎是camera.local的属性,而不是camera本身

或者你想打电话给摄像机。设置位置。。。;假设您将其添加到刚体的原型中,但之后从未使用过-

根据以下评论中提供的代码:

function Matrix4x3(){
    this.element = new Float32Array(16);
}

它没有定义setTranslation,所以这个.local.setTranslation可能也没有定义..

当我这样叫“super”时,问题并没有消失,但奇怪的是,现在它在前面一行抛出了一个错误:TypeError:无法读取undefinedyou的属性“copy”在使用原型继承时不需要调用任何super-请参阅、和中调用super和原型的比较。例如,应用于原始问题codeCamera本身不包含。local,我想将其视为刚体对象的扩展,因此,它也不包含setPosition。因此,通过任何其他对象继承刚体对象,将允许我在3D世界中操纵该对象。不确定您对自身的定义是什么,但相机的原型确实包含局部和设置位置-这是原型和继承的全部要点,该对象可以访问其原型和继承原型的所有属性,…我的意思是CameraObject在从刚体继承之前,本身不包含.local。无论如何,你是绝对正确的,现在我就像WTF,为什么在我的情况下它不能正常工作?!顺便说一句,对我来说,在继承刚体之后,它继承的原型仍然试图使用它的原始父属性看看我最近添加的主要帖子的最后一行,可能是一个新的hintI相信Matrix4x3可能不是一个合适的构造函数,或者它可能返回一些有趣的值,而不是一个对象??好的,我发现了这个问题——在CameraObject代码中的某个地方,我创建了一个本地的数组以支持多个摄像头,但我没有将旧的本地的分配给数组单元格,而是将其分配给整个数组,如下所示:this.inactiveLocals=[];this.velocals=新矩阵x4x3;萤火虫是可怕的;]