TypeError:a.dot(...)。equals不是函数

时间:2015-12-03 12:25:56

标签: javascript class methods prototype typeerror

在下面的代码中,有3种方法:add,dot和equals。 add和dot方法计算两个向量的加法和点积。 equals方法检查add和dot方法的返回值是否与传递给equals方法的参数匹配。

如果我尝试在dot方法上调用equals方法,我收到错误TypeError: a.dot(...).equals is not a function。我做错了什么,我怎么能让它发挥作用?在add方法上调用equals方法时没有错误。

function Vector(vector){

      this.vector=vector;
      }

      //add method
      Vector.prototype.add= function(b){
        var res=[];
        var vec1 =this["vector"];
        var vec2 = b["vector"];
        for (i=0; i<vec1.length; i++){
          res.push(vec1[i]+vec2[i]);
        }
        var result = new Vector(res);
        return result;
      };
      //dot product method
      Vector.prototype.dot= function(b){
        var res=0;
        var vec1 =this["vector"];
        var vec2 = b["vector"];
        for (i=0; i<vec1.length; i++){
          res+=vec1[i]*vec2[i];
        }
        return res;
      };
      //equals method
      Vector.prototype.equals = function(answer){
        if (this.toString()===answer.toString()){
          return true;
        } else {
        console.log(this);
            return false;
        }
      };
    //test
    var a = new Vector([1,2]);
    var b = new Vector([3,4]);
    a.add(b).equals(new Vector([4,6]));
    a.dot(b).equals(11);

2 个答案:

答案 0 :(得分:1)

dot方法返回Number,而不是Vector。尝试使用==代替equals

答案 1 :(得分:0)

Eric Galluzzo是正确的,但我想我会给出更多解释,因为我知道背景(感兴趣的读者,这来自 Codewars 练习:{{3} })。

编写方法的方式意味着a.dot(b).equals(11)会将Vector对象的字符串表示与11的字符串表示进行比较。这些显然不相等,因为您将比较'function Vector(vector) {...}'=='11'

之类的内容

我认为你误解了equals方法的目的。它是Vector的对象之间的相等性检查的特定实现。比较内置类型时,如果可能,请使用=====

上面链接的kata中的描述说“测试用例将使用用户提供的equals方法”,但是在Vector个对象之间进行比较时,作者仅指 。比较dotnorm方法的结果时,使用相等运算符。

有关比较对象的更多信息,请参阅http://www.codewars.com/kata/vector-class/train/javascript。它还让您了解为什么比较整个对象的字符串表示并不总是一个好主意。