Javascript 为什么会出现这种类型的错误:实例与原型

Javascript 为什么会出现这种类型的错误:实例与原型,javascript,class,inheritance,prototype,instance,Javascript,Class,Inheritance,Prototype,Instance,嗨,我正在努力学习.prototype和普通实例之间的区别,或者说它们之间发生了什么。谁能解释一下,为什么这个代码不起作用?我得到一个类型错误:undefined不是一个函数。我只是想看看忍者类和.prototype以及第一个实例之间发生了什么。然后我试着看看当我制作一个新的忍者类叫做忍者时会发生什么。重复 function Ninja() { this.swingSword = function() { return true; }; }

嗨,我正在努力学习.prototype和普通实例之间的区别,或者说它们之间发生了什么。谁能解释一下,为什么这个代码不起作用?我得到一个类型错误:undefined不是一个函数。我只是想看看忍者类和.prototype以及第一个实例之间发生了什么。然后我试着看看当我制作一个新的忍者类叫做忍者时会发生什么。重复

     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请检查更新的答案: