Javascript 类型错误:。。。这不是一个函数

Javascript 类型错误:。。。这不是一个函数,javascript,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"); co

我在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);
代码怎么了

var changeName = function(name2) {
    this.name = name2;
  }
您正在声明函数,但未将其附加到对象

应该是

   this.changeName = function(name2) {
    this.name = name2;
  }
使属性changeName作为附加到对象的函数

您正在声明函数,但未将其附加到对象

应该是

   this.changeName = function(name2) {
    this.name = name2;
  }
因此,属性changeName作为附加到对象的函数。

var changeName只会创建对函数的引用,一旦函数执行完毕,该引用将丢失

您必须将函数指定为Ninja函数的属性:

函数Ninjaname{ this.name=名称; this.changeName=functionname2{ this.name=name2; } } var ninja=新忍者; 忍者。改变名字鲍勃; console.logninja.name var changeName只会创建对函数的引用,一旦函数执行完毕,该引用将丢失

您必须将函数指定为Ninja函数的属性:

函数Ninjaname{ this.name=名称; this.changeName=functionname2{ this.name=name2; } } var ninja=新忍者; 忍者。改变名字鲍勃;
console.logninja.name 您将changeName声明为一个变量,但没有将其与“Ninja”绑定,因此我认为应该这样做,而不是使用var。所以代码变成这样

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

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

希望能有所帮助。

您将changeName声明为变量,但没有将其与“忍者”绑定,因此我认为不应该使用var,而是应该这样做。所以代码变成这样

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

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

希望有帮助。

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

您可以将函数分配给此。changeName重要的是,您要绑定到此函数,如下所示:

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;
}

虽然这些方法看起来相当相似,但差异非常重要。第一种方法为每个忍者创建一个新功能。第二种方法将对每个对象使用相同的函数。为了探究使用原型继承的原因,互联网上散布着各种各样的方法。

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

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

    return {
     changeName : function(name2) {
        this.name = name2;
     }
   }
}
您可以将函数分配给此。changeName重要的是,您要绑定到此函数,如下所示:

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;
}
虽然这些方法看起来相当相似,但差异非常重要。第一种方法为每个忍者创建一个新功能。第二种方法将对每个对象使用相同的函数。为了探究使用原型继承的原因,互联网上散布着各种各样的信息

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

    return {
     changeName : function(name2) {
        this.name = name2;
     }
   }
}
在您的代码中,如果您想访问私有数据,则不公开changeName,您可以尝试使用上述代码段


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

另一种使函数公开的方法是首先将其声明为私有。有些人喜欢使用下划线,如.Net中的常见做法:

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

   var _changeName = function(name) {
     this._name = name;
   }
 }
然后使用return将其导出。有些人可能从经典的Java样板getter和setter中了解到这一点,默认情况下,字段被声明为私有,方法使其可用:

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());

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

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

   var _changeName = function(name) {
     this._name = name;
   }
 }
然后使用return将其导出。有些人可能从经典的Java样板getter和setter中了解到这一点,默认情况下,字段被声明为私有,方法使其可用:

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());

原型呢?@AdamAzad好吧,OP的代码结构清楚地告诉我们,OP忘了连接对象而不是针对原型。那么原型呢?@AdamAzad好吧,OP的代码结构清楚地告诉我们,OP忘了连接对象而不是针对原型。恕我直言,我不太同意,即使是一个在Java等传统OO领域有多年经验并开始阅读JavaScript书籍的人,我一辈子也想不到会将changeName附加到这本书上;为什么var声明还不够?您不太同意调试代码?看在上帝的份上怎么办?如果您有多年的OOP或任何其他类型的编写代码的经验,并且能够使事情发生,那么您在JavaScript书籍中读到的第一件事就是如何调试事情。如果你在这里附加了一个调试器,就没有必要问这个问题了。。。这是javascript对象如何工作的真正基础之一
k、 哦,这本书绝对值得一读:恕我直言,我不太同意,即使是一个在Java等传统OO世界有多年经验并开始阅读JavaScript书籍的人,我也不想在这本书上附加changeName;为什么var声明还不够?您不太同意调试代码?看在上帝的份上怎么办?如果您有多年的OOP或任何其他类型的编写代码的经验,并且能够使事情发生,那么您在JavaScript书籍中读到的第一件事就是如何调试事情。如果你在这里附加了一个调试器,就没有必要问这个问题了。。。哦,这是javascript对象如何工作的真正基础之一。哦,这本书绝对值得一读:作为var changeName关键解释的答案,接受它只会创建一个函数引用,一旦函数执行完毕,该引用就会丢失。;所有其他答案都是正确的,但直到我读了这篇文章,我才发现简单的var声明之间的区别。接受作为var changeName关键解释的答案只会创建对函数的引用,一旦函数执行完毕,该引用就会丢失。;所有其他答案都是正确的,但直到我阅读了这篇文章,我才发现简单的var声明之间的区别。