TypeError:...不是函数

时间:2018-02-05 08:43:40

标签: javascript

我在NodeJS中的JavaScript代码导致:

TypeError: ninja.changeName is not a function

以下是我的代码:

function Ninja(name){
  this.name = name;

  var changeName = function(name2) {
    this.name = name2;
  }
}

var ninja = new Ninja("John");
ninja.changeName("Bob");
console.log(ninja.name);

代码出了什么问题?

6 个答案:

答案 0 :(得分:2)

var changeName = function(name2) {
    this.name = name2;
  }

您正在声明一个函数,但未将该函数附加到该对象。

应该是

   this.changeName = function(name2) {
    this.name = name2;
  }

使属性changeName作为附加到对象的函数。

答案 1 :(得分:1)

var changeName将只创建一个函数的引用,该函数在函数执行完毕后将丢失。

您必须将该函数指定为Ninja函数的属性,而不是:

function Ninja(name) {
  this.name = name;

  this.changeName = function(name2) {
    this.name = name2;
  }
}

var ninja = new Ninja("John");
ninja.changeName("Bob");
console.log(ninja.name);

答案 2 :(得分:1)

您正在为变量分配函数。这与在对象原型继承结构中设置函数不同,变量changeName仅在Ninja的上下文范围内。

您可以将功能分配给this.changeName(重要的是您绑定到this),如下所示:

function Ninja(name){
  this.name = name;

  this.changeName = function(name2) {
    this.name = name2;
  }
}

或者您可以使用原型:

function Ninja(name){
  this.name = name;
}
Ninja.prototype.changeName = function(name2) {
  this.name = name2;
}

尽管这些方法看起来非常相似,但差异非常重要。第一种方法为每个创建的Ninja创建一个新函数。第二种方法将为每个对象使用相同的函数。为了研究使用原型继承的原因,互联网上散布着各种blog posts

答案 3 :(得分:0)

您将changeName声明为变量但未将其与'Ninja'绑定,所以我相信不是使用var,而是应该这样做。所以代码变成这样。

function Ninja(name){
this.name = name;

  this.changeName = function(name2) {
    this.name = name2;
  }
}

希望它有所帮助。

答案 4 :(得分:0)

function Ninja(name){
      this.name = name;

    return {
     changeName : function(name2) {
        this.name = name2;
     }
   }
}

在您的代码中,如果您想要访问可以使用上述代码段尝试的私人数据,则不会公开changeName

答案 5 :(得分:0)

使您的函数公开可用的另一种方法是首先将其声明为私有(有些人更喜欢使用下划线,就像在.Net中一样):

 function Ninja(name) {
   this._name = name;

   var _changeName = function(name) {
     this._name = name;
   }
 }

然后使用return导出它。有些人可能从经典的Java样板 Getters and Setters 中知道这一点,其中默认情况下字段被声明为private,而且方法使它们可用:

function Ninja(name) {
    this._name = name;

    var _changeName = function (name) {
        this._name = name;
    }

    return {
        changeName: _changeName,
        getName: function () {return _name;}
    }
}

...现在,使用对象:

var ninja = new Ninja("John");
ninja.changeName("Bob");
console.log(ninja.getName());