Я создал новый экземпляр ('instance1' и 'instance2'), используя ключевое слово 'new'. именно так.
1.with 'Child.prototype.constructor = Child'
function Parent() {
}
function Child() {
Parent.call(this);
}
Child.prototype = new Parent();
Child.prototype.constructor = Child;
var instance1 = new Child();
2.without 'Child.prototype.constructor = Child'
function Parent() {
}
function Child() {
Parent.call(this);
}
Child.prototype = new Parent();
var instance2 = new Child();
И я могу проверить конструктор экземпляра, используя ключевое слово "instanceof".
instance1 instanceof Child // true
instance1 instanceof Parent // true
этот результат имеет смысл, потому что я четко написал "Child.prototype.constructor = Child;". поэтому ключевое слово instanceof может найти оба конструктора. НО
instance2 instanceof Child // true
instance2 instanceof Parent // true
но этот результат для меня не имеет смысла. Я ожидал
instance2 instanceof Child // false
потому что я не писал "Child.prototype.constructor = Child;".
Зачем???
instanceof
оператор ищет, если объект Constructor.prototype
присутствует в цепочке Prototype (__proto__
) тестируемого объекта.
Итак, в вашем примере:
function Parent() {}
function Child() {
Parent.call(this);
}
Child.prototype = new Parent();
var instance2 = new Child();
Поскольку instance2
построен из конструктора Child()
, то __proto__
instance2
указывает на объект-прототип конструктора Child()
т.е. Child.prototype
.
Когда вы проверяете:
instance2 instanceof Child
instanceof
будет выглядеть, если объект Child.prototype
присутствует в цепочке прототипов instance2
, что приводит к истинному, поскольку instance2
был создан из конструктора Child()
.
Другими словами:
instance2.__proto__ === Child.prototype
Пример вашего второго примера:
instance2 instanceof Parent
Здесь также цепочка прототипов instance2
ie (__proto__
) имеет объект Parent.prototype
который будет оцениваться как true. т.е.
instance2.__proto__.__proto__ === Parent.prototype
Конечное примечание:
Оператор instanceof
очень похож на вышеупомянутые условные проверки, чтобы проверить, является ли объект экземпляром конструктора. Свойство constructor
присутствующее в объекте prototype
функции Constructor, никогда не используется instanceof
оператора во время тестирования.
Надеюсь это поможет.
instance2.__proto__
возвращает «Parent», аChild.prototype
также возвращает «Parent». поэтому я могу понять, что instance2 связан с "Parent", но я думаю, что нет никакой связи между "instance2" и конструктором "Child". ноinstance2 instanceof Child
возвращает "true". как узнать instance2 ссылку на Child.