我已经定义了一个javascript类,用于矩阵变换(在html5画布上绘制的点),它有多种方法(例如,乘法,旋转,缩放,平移)。在我的rotate方法中,我需要调用multiply,但由于它是在类中定义的另一个方法,因此必须以不同于在类定义之外调用的方式调用它。对于类构造函数,我有:
function Transform() {
this.identity();
}
和旋转方法:
Transform.prototype.rotateX = function(rad) {
var c = Math.cos(rad);
var s = Math.sin(rad);
var rx = [[1, 0, 0, 0],
[0, c, -s, 0],
[0, s, c, 0],
[0, 0, 0, 1]];
this.m = multiply(rx, this.m);
document.write('matrix rx:<br />');
display(rx);
document.write('rx * this.m =<br />');
display(this.m);
};
我来自带有OOP的C ++背景,所以这种定义类的方式看起来有点奇怪,但似乎你应该能够调用类中定义的函数而不使用类似于如何在C ++中使用范围限定运算符定义方法,您可以自由访问任何类&#39;数据。出于某种原因,在javascript中,情况绝对不是这样,因为我收到错误:
Uncaught ReferenceError: multiply is not defined
在类定义的内部和外部调用Javascript类中定义的方法的正确方法是什么?
答案 0 :(得分:1)
但似乎你应该能够调用类中定义的函数而不使用类似于C ++中的点运算符
不。在JavaScript中,this
不是可选的,因此如果multiply
附加到对象(来自原型,或者只是在构造函数中分配给它),则需要this
:
this.m = this.multiply(rx, this.m);
您可能正在考虑调用范围内的函数,不需要this
。以下是这三个例子:
function Thingy(prop) {
this.prop = prop;
// Here's a "method" we add in the constructor:
this.method1 = function() {
snippet.log("Thingy#method1, prop = " + this.prop);
};
};
Thingy.prototype.method2 = function() {
snippet.log("Thingy#method2, prop = " + this.prop);
};
Thingy.prototype.method3 = function() {
snippet.log("Thingy#method3, prop = " + this.prop);
this.method1();
this.method2();
inScopeOnlyForMethod3();
inScopeOnlyForMethod3.call(this);
function inScopeOnlyForMethod3() {
snippet.log("inScopeOnlyForMethod3, prop = " + this.prop);
}
};
var t = new Thingy(42);
t.method3();
<!-- Script provides the `snippet` object, see http://meta.stackexchange.com/a/242144/134069 -->
<script src="//tjcrowder.github.io/simple-snippets-console/snippet.js"></script>
请注意,JavaScript中的this
与C ++中的this
根本不同。在JavaScript中,this
函数的function
通常由如何调用函数决定,而不是由它定义的位置决定。 (ES2015 - 最新的JavaScript标准 - 定义了不使用function
关键字的“箭头”函数,该关键字从创建它们的上下文继承this
。)
同样,C ++类与JavaScript的构造函数和原型的根本不同。 (请注意,您可以使用构造函数执行JavaScript的原型继承,或直接通过Object.create
执行。)