簡體   English   中英

為什么出現此類型錯誤:實例與原型

[英]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());

prototypeFunction對象的屬性,並且所有功能對象都繼承自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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM