[英]Why am I getting this type error: instance vs prototype
嗨,我正在嘗試了解兩者之間的區別,或者.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
。 並且您試圖在undefined
上調用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.prototype
而不是Ninja
上定義了swingSword
。 當您調用Ninja.swingSowrd()
,JavaScript將首先在Ninja
查找它,然后在其父級的原型中查找該Function.prototype
,即Function.prototype
。 在Ninja
查找將不涉及Ninja.prototype
。 那就是您在那條線上也遇到錯誤。
您不能調用Ninja.swingSword();
因為在調用Ninja()
構造函數/函數之前未定義函數。 但是你可以做new Ninja.swingSword();
返回true
。
就是說, ninja.prototype
是未定義的,因為它是Ninja
類的實例,並且所有prototype
變量都直接分配給ninja
。 但是,在構造時,需要將this.swingSword
設置為返回true
的新函數。 這就是為什么ninja.swingSword();
將返回true
,而不是您通過原型函數所期望的false
。
Ninja函數沒有ninja.prototype的swingSword方法。 函數是一個與許多其他對象相同的對象,不同之處在於可以使用new關鍵字使用該函數創建實例,並且可以在原型成員中進行構建。
如果我有一個名為ben的對象,例如:
var ben = {
name:"Ben",
address:{
street:"street name",
city:"city name"
}
}
這里應該很明顯,我沒有ben.street,但是有一個ben.address.street。
關於構造函數和原型的說明可以在這里找到。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.