嗨,我正在尝试了解两者之间的区别,或者.prototype和常规实例之间发生了什么。谁能解释一下,为什么这段代码行不通?我收到类型错误:“未定义不是函数”。我只是想看看Ninja()类和.prototype与第一个实例之间发生了什么。然后,我尝试查看当我创建一个名为ninja的新Ninja()类时会发生什么。并重复

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

最佳答案

prototypeFunction对象的属性,并且由于所有功能对象都从Function继承,因此它们都具有该属性。在您的情况下,Ninja是一个函数,但是ninja只是由Ninja构造的对象,因此它没有prototype。由于它没有prototype,因此JavaScript返回undefined。并且您试图在swingSword上调用undefined,这是不可能的。这就是为什么您会收到该错误。

你可以这样检查

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


另外,请注意,您仅在swingSword而不是Ninja.prototype上定义了Ninja。当您调用Ninja.swingSowrd()时,JavaScript会先在Ninja中查找,然后在其父级原型(Function.prototype)中查找。在Ninja上的查找将不涉及Ninja.prototype。那就是您在那条线上也遇到错误。

关于javascript - 为什么出现此类型错误:实例与原型(prototype),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23026769/

10-11 12:38