как проверить конструктор экземпляра

1

Я создал новый экземпляр ('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;".

Зачем???

Теги:
constructor
instanceof

1 ответ

0

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 оператора во время тестирования.

Надеюсь это поможет.

  • 0
    спасибо, но я все еще не ясно. instance2.__proto__ возвращает «Parent», а Child.prototype также возвращает «Parent». поэтому я могу понять, что instance2 связан с "Parent", но я думаю, что нет никакой связи между "instance2" и конструктором "Child". но instance2 instanceof Child возвращает "true". как узнать instance2 ссылку на Child.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню