Javascript 为什么会出现这种类型的错误:实例与原型
嗨,我正在努力学习.prototype和普通实例之间的区别,或者说它们之间发生了什么。谁能解释一下,为什么这个代码不起作用?我得到一个类型错误:undefined不是一个函数。我只是想看看忍者类和.prototype以及第一个实例之间发生了什么。然后我试着看看当我制作一个新的忍者类叫做忍者时会发生什么。重复Javascript 为什么会出现这种类型的错误:实例与原型,javascript,class,inheritance,prototype,instance,Javascript,Class,Inheritance,Prototype,Instance,嗨,我正在努力学习.prototype和普通实例之间的区别,或者说它们之间发生了什么。谁能解释一下,为什么这个代码不起作用?我得到一个类型错误:undefined不是一个函数。我只是想看看忍者类和.prototype以及第一个实例之间发生了什么。然后我试着看看当我制作一个新的忍者类叫做忍者时会发生什么。重复 function Ninja() { this.swingSword = function() { return true; }; }
function Ninja() {
this.swingSword = function() {
return true;
};
}
Ninja.prototype.swingSword = function() {
return false;
};
var ninja = new Ninja;
console.log(Ninja.prototype.swingSword());
console.log(Ninja.swingSword());
console.log(ninja.swingSword());
console.log(ninja.prototype.swingSword());
原型是函数对象的一个属性,由于所有函数对象都继承自函数,所以它们都具有该属性。在你的例子中,忍者是一个函数,但忍者只是一个由忍者构造的对象,所以它没有原型。因为它没有原型,所以JavaScript返回的是未定义的。您试图调用未定义的swingSword,这是不可能的。这就是为什么你会犯这样的错误
你可以这样检查
console.log({}.toString.call(Ninja));
# [object Function]
console.log({}.toString.call(ninja));
# [object Object]
console.log(Ninja.prototype);
# { swingSword: [Function] }
console.log(ninja.prototype);
# undefined
另外,请注意,您仅在Ninja上定义了swingSword。prototype不在Ninja上定义。当您调用Ninja.swingsowd时,JavaScript将首先在Ninja中查找它,然后在其父代的原型(Function.prototype)中查找它。查找忍者不会涉及忍者原型。也就是说,你在那条线上也遇到了一个错误。你不能叫忍者;因为函数在调用Ninja构造函数/函数之前没有定义。
但是你可以做新的忍者;返回真值
也就是说,ninja.prototype是未定义的,因为它是ninja类的一个实例,所有原型变量都直接分配给ninja。但是,在构造时,您将this.swingSword设置为一个返回true的新函数。这就是为什么忍者;将返回true,而不是通过prototype函数预期的false。函数Ninja没有swingSword方法,而Ninja.prototype有。函数是一个与许多其他对象相同的对象,不同之处在于您可以使用new关键字使用它创建实例,并且它具有内置原型成员 如果我有一个叫做ben的物体,像这样:
var ben = {
name:"Ben",
address:{
street:"street name",
city:"city name"
}
}
这里应该很明显,我没有ben.street,但有ben.address.street
可以找到关于构造函数和原型的解释。好的。那么为什么Ninja.swingSword在控制台中不起作用?@ChristopherCrak请检查更新的答案: