@Funny_Cat

Почему некорректно работает оператор 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
  • Вопрос задан
  • 104 просмотра
Решения вопроса 1
Xuxicheta
@Xuxicheta
инженер
cat1.__proto__.__proto__.__proto__ === Dog.prototype

поэтому и true
У cat1 третий протип в цепочке это Animal, тож же самый что и у Mammal и у Dog, который вы тут присвоили.
Dog.prototype = Mammal.prototype;

А в цепочке прототипов dog1 нет Cat.prototype

https://learn.javascript.ru/instanceof
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы