嗨,我正在尝试了解两者之间的区别,或者.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());
最佳答案
prototype
是Function
对象的属性,并且由于所有功能对象都从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/