грамматика
экземпляр объекта конструктора
параметр
объект:
Объект, который будет обнаружен.
конструктор:
Конструктор
описывать:
Оператор экземпляра используется для определения того, существует ли конструктор. Прототип в цепочке прототипа объекта параметра.
// Определите функцию конструктора C () {} функция d () {} var O = new C (); // true, потому что object.getPrototypeof (o) === C.prototypeo Encementof c; // Неверно, потому что D.Protototyp не находится на прототипе цепочки o ancementof d; o экземпляр объекта; // true, потому что object.prototype.isprototypeof (o) Возвращает truec.prototype ancementof object // true, то же самое, что и выше, c.prototype = {}; var o2 = new c (); o2 ancementof c; // trueo Incementof c; // false, c.prototype указывает на пустой объект, который не находится на цепочке прототипа O.D.Prototype = new C (); // наследуют var o3 = new d (); o3 экземпляр d; // recueo3 ancessionof c; // истинныйСледует отметить, что если выражение obj экземпляры Foo возвращает True, это не означает, что выражение вернется навсегда, потому что значение свойства Foo.Prototype может измениться, и измененное значение может не существовать в цепочке прототипа OBJ, и значение исходного выражения станет ложным. В другом случае значение исходного выражения также изменится, что является тем, когда цепочка прототипа объекта OBJ изменяется. Хотя в текущей спецификации ES мы можем прочитать только прототип объекта и не можем его изменить, он может быть достигнут с помощью нестандартного магического атрибута __proto__. Например, после выполнения obj .__ Proto__ = {}, obj экземпляр Foo вернет false.
экземпляры и многоглобальные объекты (взаимодействие между несколькими кадрами или несколькими окнами)
В браузере нашим сценариям может потребоваться взаимодействовать между несколькими окнами. Многочисленные окна означают множество глобальных сред, а разные глобальные среды имеют разные глобальные объекты, что имеет различные встроенные конструкторы типа. Это может вызвать некоторые проблемы. Например, выражение [] expressionof window.frames [0] .Array вернет false, потому что массив.
Пример
Общее использование экземпляра - определить, имеет ли A типа B:
console.log (истинный экземпляр Boolean); // false console.log (новый номер (1) exanceOf number); // истинный
экземпляр также может определить родительский тип:
function Cethan () {} function child () {} child.prototype = new отцом (); var a = new child (); console.log (экземпляр ребенка); // trueconsole.log (экземпляр отца); // истинныйДетский конструктор наследует от отца. Пример A, несомненно, построен ребенком, но почему это также экземпляр отца? Фактически, ядро экземпляра оператора может быть просто описано с помощью следующего кода:
Проверка функции (a, b) {while (a .__ Proto__) {if (a .__ Proto__ === B.Prototype) вернуть true; a = a .__ Proto__; } return false;} function foo () {} console.log (exante actionof object === check (object, object)); // true console.log (функция функции function === check (function, function)); // true console.log (номер экземпляра exanceof number === Проверка (номер, номер)); // true console.log (string encessionof string === check (string, string)); // true console.log (функция exanceOf object === проверка (функция, объект)); // true console.log (foo incessionof function === Проверка (foo, функция)); // true console.log (foo ancessionof foo === check (foo, foo)); // true console.log (foo ancessionof foo === check (foo, foo)); // true console.log (foo ancessionof foo === check (foo, foo)); // истинныйПроще говоря, если A является экземпляром B, то A может определенно использовать методы и свойства, определенные в прототипе B. Затем в коде это означает, что в цепочке прототипа с B.Prototype есть объекты с тем же значением, поэтому просто следуйте цепочке прототипа A для поиска слой по слою.
Стоит также отметить, что строковые номера и функция являются функциями, а функции равномерно построены из функции. Они похожи на любую простую функцию, и они могут использовать свойства прототипа на функции:
Function.prototype.a = 10; console.log (String.a); // 10
Наконец, давайте кратко поговорим о первых двух вопросах.
// Для удобства экспрессии сначала отличите левую экспрессию и правую экспрессию функцию = функция, функция = функция; // Ниже постепенно выводится в соответствии со спецификациями o = functionr.prototype = function.prototype l = function .__ Proto__ = function.prototype // Первое суждение O == L // Возврат true // Для удобства выражения сначала отличите левую экспрессию и правую экспрессию string = string, stringr = string; // Ниже постепенно выводится в соответствии со спецификациями o = stringr.prototype = string.prototype l = stringl .__ Proto__ = function.prototype // Первые временные судьи o! = L // петли снова, чтобы обнаружить, что L по -прежнему имеет __proto__ l = string.prototype .__ Proto__ = объект. __proto__ l = string.prototype .__ Proto__ = null // третий раз судьи l == null // возвращать ложные