2

JS 新手.. 谁能告诉我在以下函数中使用 this 是否合适:

var Vector = (function()...

this.prototype.add = function(someVector2){

    var tmpVect = this;
    tmpVector.x += someVector2.x;
    tmpVector.y += someVector2.y;
    return tmpVect;
};

从某种意义上说,'var tmpVect = this' 将产生一个局部向量变量,该变量具有调用该函数的向量的 x 和 y 属性?

干杯

4

3 回答 3

1

我会这样重写:(根据您的评论)

var Vector = function(){

}

Vector.prototype.add = function(someVector2){
    var tmpVector = new Vector;
    tmpVector.x =  this.x + someVector2.x;
    tmpVector.y = this.y + someVector2.y;

    return tmpVector;
}

然后你可以像这样调用它:

var someVector = new Vector();
var addedVector = someVector.add(someVector);

上面将存储一个新的 Vector ,addedVector它的xy是 的两倍someVector

于 2013-10-24T20:59:44.177 回答
1

新对象只能以非常明确的方式声明;"new Vector()" 或 "variable = {x:5, y:2}" 等。每当你写 "something = somethingElse" 时,都不会创建对象。您甚至可以使用三等式比较器来确认这一点。

v1 = new Vector(1, 2);
v2 = new Vector(1, 2);
v1 === v2 // will return false

v3 = v1;
v1 === v3 // will return true

v1.x = 17;
v3.x // will return 17

为了便于开发,您可以定义一个 Vector 原型函数“clone”,它创建并返回一个“ new Vector()”,其 x 和 y 与原始函数相同。如果你想要一个新add()的返回,你需要做类似的事情。

另外:ryan 的答案是切题正确的-您应该只定义一次原型函数,而不是每次创建 Vector 时。

于 2013-10-24T21:01:48.910 回答
1

以下是我将如何编写它。它还有一个我从 David Herman 那里读到的技巧,可以让你的构造函数new不可知。这意味着您不一定要Vector使用new关键字创建新的。

function Vector(x,y) {
  // Make the constructor `new` agnostic
  if (!(this instanceof Vector)) {
    return new Vector(x,y);
  }

  this.x = x;
  this.y = y;

  return this;
}

Vector.prototype.add = function(someVector2) {
  this.x += someVector2.x;
  this.y += someVector2.y;

  return this;
};

// Example
var myVector = new Vector(1,2);
var myOtherVector = Vector(1,2);

myVector.add(myOtherVector);
于 2013-10-24T21:05:59.063 回答