Показать сообщение отдельно
  #1 (permalink)  
Старый 29.08.2018, 17:11
Новичок на форуме
Отправить личное сообщение для FunnyCat Посмотреть профиль Найти все сообщения от FunnyCat
 
Регистрация: 29.08.2018
Сообщений: 2

Почему некорректно работает оператор instanseof?
Добрый день! Где можно увидеть как досконально работает оператор instanceof.

Вот пример, цепочки прототипов ("иерархия животных"). Несмотря на то, что тип Dog вообще не играет роли для типа Cat, оператор instanceof утверждает, что объект (cat1), созданный с помощью функции-конструктора Cat также является типом Dog??? (Если прототип собаки будет создаваться с помощью прототипа функции-конструктора из цепочки прототипов кота - то есть, например, так: Dog.prototype = Mammal.prototype). Но если же прототипом функции конструктора Dog будет являться конкретный новый объект Mammal (млекопитающее), созданный через оператор new, то есть так: Dog.prototype = new Mammal(), то объект cat1, уже не будет типом Dog. В чём причина??? Как работает этот оператор - instanceof?

var Animal = function(){
      this.run = function(){
        console.log("I am running or swimming...");
      };
    }
    
    var Mammal = function(){
      this.run = function(){
        console.log("I am running!");
      };
      this.voice = function(){
        console.log("...");
      };
    };
    Mammal.prototype = new Animal();
    
    var Cat = function(){
      this.voice = function(){
        console.log("Meow!!!");
      };
      
    };
    Cat.prototype = new Mammal();
    
    var DomesticCat = function(){
      this.height = "80";
      this.weight = "30";
    }
    DomesticCat.prototype = new Cat();
    
    var Dog = function(){
      this.height = "100";
      this.weight = "50";
      this.play_with_cat = function(){
        console.log("I am playing!");
      };
    }
    Dog.prototype = Mammal.prototype;

// если будет использоваться создание объекта через оператор new Mammal(), то выражение (cat1 instanseof Dog)
// результирует в false
    
    var cat1 = new DomesticCat();
    var dog1 = new Dog();
    
    console.log(cat1 instanceof Dog); // true
    console.log(dog1 instanceof Cat); // false
Ответить с цитированием