Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #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
Ответить с цитированием
  #2 (permalink)  
Старый 29.08.2018, 17:24
Аватар для Aetae
Любитель
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 5,646

Возможно тебе поможет эта тема: https://javascript.ru/forum/misc/750...rototipov.html

Но вообще если Dog.prototype = Mammal.prototype, то Dog и Mammal одно и то же для instanceof.
__________________
29375, 35

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

Сообщение от Aetae Посмотреть сообщение
Возможно тебе поможет эта тема: https://javascript.ru/forum/misc/750...rototipov.html

Но вообще если Dog.prototype = Mammal.prototype, то Dog и Mammal одно и то же для instanceof.
Я читал ту ветку форума уже. Тут вопрос немного другой. Почему instanceof так поступает?

Вот что выдаёт консоль: заменяет в цепочке Mammal на Dog? Но я же вывожу объект cat!!! (созданный с помощью оператора new DomesticCat()). С чем связан такой трюк?

DomesticCat {height: "80", weight: "30"}
			height:"80"
			weight:"30"
			__proto__: Cat
				voice: ƒ ()
				__proto__: Dog
					constructor: ƒ ()
					run: ƒ ()
					voice: ƒ ()
					__proto__: Animal
						constructor: ƒ ()
						run: ƒ ()
						__proto__: Object
Ответить с цитированием
  #4 (permalink)  
Старый 29.08.2018, 18:05
Аватар для Aetae
Любитель
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 5,646

Потому что родитель объекта возможно определить только по __proto__. В __proto__ созданного объекта попадает prototype функции его сконструировавшей. Если у двух функций один и тот же prototype, определить какой именно из них он был создан принципиально невозможно.

Dog и Mammal имеют прототипом один и тот же объект(не копию, заметьте, а именно один и тот же, ибо объекты передаются по ссылке), потому невозможно отличить объект созданный Dog от объекта созданного Mammal. Потому new Dog точно также instanceof Mammal, как new Mammal - instanceof Dog.
А поскольку DomesticCat наследник Cat, и Cat наследник Mammal, то DomesticCat instanceof Mammal и, соответственно, instanceof Dog.
__________________
29375, 35

Последний раз редактировалось Aetae, 29.08.2018 в 18:10.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Почему Jquery не работает в arcticmodal при вызове окна с большой высотой? sergey24 Общие вопросы Javascript 5 21.09.2017 15:49
Почему не работает? Rora Общие вопросы Javascript 7 10.05.2017 10:09
Почему не работает подключенный скрипт?? ivt22 Элементы интерфейса 1 04.01.2016 09:59
Не пойму почему не работает код? Mukhtar Events/DOM/Window 4 28.04.2013 23:01
Не могу понять, почему не работает автокомпил в IE 8 gargon2008 jQuery 0 07.06.2011 10:31