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

Работа instanceof и цепочка прототипов
Всем привет! Изучаю js, читая Флэнагана и вот я наткнулся на мозговыносящий мне момент, связанный с цепочкой прототипов и работой instanceof.

В подробном руководстве Флэнагана написано "Чтобы вычислить значение выражения o instan­ce­of f, интерпретатор JavaScript определяет значение f.prototype и затем пытается отыскать это значение в цепочке прототипов объекта o. В случае успеха объект o считается экземпляром класса f"

Затем пробую выполнить следующую задачу:
создать объект с, котрый будет наследником объекта b, который является наследником объекта а. При этом эти объекты создаются при помощи соответствующих конструкторов (new A(), new B(), new C()).
получается следующий код:
function A() {
    this.a = 'a';
}

function B() {
    this.b = 'b';
}

function C() {
    this.c = 'c';
}

let a = new A();

B.prototype = a;

let b = new B();

C.prototype = b;

let c = new C()


В результате если ввести в консоль c, то в хроме нам выведет объект. И мое непонимание начинается, когда я смотрю прототипы этого объекта. Хром показывает:
C {c: "c"}
....c: "c"
....__proto__: A
........b: "b"
........__proto__: A
............a: "a"
............__proto__:
................constructor: f A()
................__proto__: Object

Так же если ввести в консоль C.prototype, то мы увидим следующее:
A {b: "b"}
....b: "b"
....__proto__: A
........a: "a"
........__proto__:
............constructor: f A()
............__proto__: Object

Везде в цепочке прототипов указан А и если мы введем в консоль c instanceof C, то резульататом будет true. НО! если мы введем а intanceof C, то результатом будет false. И казалось бы логично, ведь а построен конструктором А. Но ведь в книге сказано
"интерпретатор JavaScript определяет значение f.prototype и затем пытается отыскать это значение в цепочке прототипов объекта o. В случае успеха объект o считается экземпляром класса f"

Так почему a instanceof C будет false, если в консоли явно видно, что прототипом C является прототип А, и а имеет тот же самый прототип, что и С?

Буду благодарен как прямым ответам, так и ссылкам на подбробное разжевывание этого вопроса. На MDN ответа так и не нашел.

P.S. Доп. вопрос: почему если вписать в консоль c мы увидим C {c: "c"}, а если вписать b, то увидим не B {b: "b"}, a A {b: "b"}
Ответить с цитированием