我在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);
代码出了什么问题?
答案 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());