Мы знаем, что оператор экземпляра используется для проверки того, является ли объект экземпляром конструктора. Ниже перечислены различные сценарии, в которых он возвращает true.
1. Объект obj создается с помощью нового конструктора, тогда obj экземпляр конструктора имеет значение true.
Скопируйте код кода следующим образом:
функция Person(n, a) {
это.имя = п;
this.age = а;
}
var p = new Person('Джон Бэкус', 82);
console.log(p экземпляр Person); // true;
2. Если существует отношение наследования, то экземпляр подкласса и родительского класса также вернет true.
Скопируйте код кода следующим образом:
функция А(){}
функция Б(){}
B.prototype = new A() // B наследуется от A
вар б = новый B ();
console.log(b экземпляр A // правда);
3. Поскольку Object является корневым классом, все остальные пользовательские классы наследуются от него, поэтому экземпляр Object любого конструктора возвращает true.
Скопируйте код кода следующим образом:
функция А() {}
вар а = новый А();
console.log(экземпляр объекта); // true;
вар стр = новая строка ('привет');
console.log(str экземпляр объекта); // true;
вар num = новый номер (1);
console.log(num экземпляра объекта); // true;
Даже сам конструктор
Скопируйте код кода следующим образом:
функция А() {}
console.log(экземпляр объекта); // true;
console.log(String экземпляр объекта); // true;
console.log(Номер экземпляра объекта); // true;
4. Все конструкторы экземпляра функции возвращают true
Скопируйте код кода следующим образом:
функция А() {}
console.log(Функция экземпляра // true);
console.log(String экземпляр функции); // true);
console.log(Число экземпляра функции); // true);
Вышеупомянутые четыре пункта суммированы в одном предложении: Если экземпляр создан определенным классом или его подклассом, то instanceof возвращает true. Или, если прототип определенного конструктора существует во внутренней цепочке прототипов объекта obj, возвращается true. То есть результат instanceof не имеет прямого отношения к самому конструктору. Это распространено во многих языках.
Класс Person определен в Java, и экземпляр p возвращает true как для Person, так и для Object.
Скопируйте код кода следующим образом:
класс Человек {
публичное имя строки;
общественный возраст;
Человек (String n, int a) {
это.имя = имя;
this.age = а;
}
public static void main(String[] args) {
Person p = new Person("Джон Бэкус", 82);
System.out.println(p экземпляр Person); // true);
System.out.println(p экземпляр объекта); // true;
}
}
Если в Java существуют отношения наследования, родительский класс экземпляра подкласса также возвращает true.
Скопируйте код кода следующим образом:
// родительский класс
класс Человек {
публичное имя строки;
общественный возраст;
Человек (String n, int a) {
имя = имя;
возраст = а;
}
}
// подкласс
публичный класс Man расширяет Person{
государственный струнный университет;
Man(String n, int a, String s) {
супер(п, а);
университет = с;
}
public static void main(String[] args) {
Man mm = новый Человек("Джон Резиг", 29, "ФКУ");
System.out.println(mm instanceof Man); // true);
System.out.println(mm instanceof Person); // также верно;
}
}
Зная это, следующая производительность в JS неудивительна.
Скопируйте код кода следующим образом:
//Определяем два конструктора
функция А(){}
функция Б(){}
А.прототип = Б.прототип = {а: 1};
//Создаем два экземпляра разных конструкторов соответственно
вар а = новый А();
вар б = новый B ();
console.log(экземпляр B // true);
console.log(b экземпляр A // правда);
Мы видим, что a и b создаются с помощью A и B соответственно, но оба экземпляра B и b экземпляра A являются истинными. То есть, хотя объект a не создается с помощью конструктора B, он все равно возвращает true. Поскольку B.prototype существует во внутренней цепочке прототипов a.
Благодаря динамическим характеристикам языка JS прототип может быть изменен во время выполнения, поэтому неудивительно, что следующий код возвращает false. Поскольку A.prototype больше не находится во внутренней цепочке прототипов, цепочка прерывается.
Скопируйте код кода следующим образом:
функция А(){}
вар а = новый А();
A.prototype = {}; // Динамическое изменение прототипа, обратите внимание, что это необходимо сделать после создания
console.log(экземпляр A // ложь);
Обратите внимание, что написание этого также нарушает первый пункт, изложенный выше: объект obj создается с помощью нового конструктора, тогда obj экземпляр конструктора имеет значение true.
Фактически в стандарте ECMAScript (с учетом 5.1) внутренняя реализация экземпляра будет вызывать внутренний метод [[HasInstance]] конструктора, который описывается следующим образом.
Если F является функциональным объектом, при выполнении F(V) будут выполнены следующие шаги:
1. Если левый операнд V экземпляра instanceof не является типом объекта, верните false напрямую.
Скопируйте код кода следующим образом:
вар а, б = 1, с = истина, d = 'привет';
console.log(a instanceof Object); // false здесь значение не определено
console.log(b экземпляр объекта); // ложь;
console.log(c экземпляр объекта); // ложь;
console.log(d экземпляр объекта); // ложь;
2/3. Получите атрибут прототипа конструктора F. Если это не тип объекта, должно быть выброшено исключение TypeError.
Скопируйте код кода следующим образом:
функция А(){}
A.prototype = 1 // Устанавливаем прототип A необъектного типа
вар а = новый А();
console.log(экземпляр A);
Подсказки об исключении, выдаваемые каждым браузером, различны.
Firefox18:
Хром24:
Сафари6:
Опера12:
IE10:
4. Непрерывно выполнять следующую логику: установить V равным V внутреннего прототипа, вернуть false, если V равно нулю, и вернуть true, если V и O указывают на один и тот же объект.