2012-04-08 2 views
2

Я читаю книгу на JavaScript-скрипте ООП и застрял на одном из примеров.путаница прототипа: свойство родительского прототипа, затронутое прототипом ребенка

В первой версии примерного кода создается новый экземпляр функции-конструктора Shape и вызывается метод toString. Метод toString возвращает «Треугольник», который является свойством name прототипа Triangle, хотя форма «Форма» должна быть name прототипом Shape.

Во второй версии примерного кода метод toString возвращает «Форма», как предполагалось. Мне интересно, как изменения во второй версии кода имели какое-то значение, потому что это похоже на обе версии кода примера, прототип Triangle содержит ссылку на прототип Shape, поэтому свойство name прототипа Shape будет по-прежнему будет обновлен до "треугольника" из-за Triangle.prototype.name = "Triangle";

первой версии: jsfiddle

второй версии: jsfiddle

ответ

1

Во втором примере, когда вы назначили Triangle.prototype = new F(); то новый экземпляр F function был создан, и он унаследовал прототип Shape, который означает любые изменения в Triangle.prototype будут отражены в этом экземпляре объекта, но не в F's constructor, так как объект экземпляр не может изменить его конструктор, но если вы измените его в constructor's prototype/Shape.prototype, то будет отражен и любой объект, созданный этой конструкторской функцией. Но если вам назначили Triangle.prototype = F.prototype, это может быть другим.

Я внесла некоторые изменения here. Надеюсь, это поможет вам понять, увидеть в консоли.

0

Во втором примере, Triangle.prototype получает новую ссылку - новый F(). Таким образом, в отличие от первого примера, Triangle.prototype на самом деле является другой ссылкой, чем Shape.prototype.

+0

Если F() ссылается на ссылки Shape.prototype и Triangle.prototype F(), не ссылается ли ссылка Triangle.prototype на Shape.prototype на транзитивное свойство? – user701510

+0

новый F() и F.prototype отличается. –

Смежные вопросы