Один. Два прототипа
Многие люди знают, что JavaScript - это прототип наследование. У каждого конструктора есть прототип, через который наследование JavaScript может быть красивым.
Фактически, один только этот атрибут не может завершить наследство JavaScript.
Я не буду много говорить о прототипе, который мы используем в коде. Вы можете проверить информацию.
Другой невидимый прототип.
Каждый экземпляр имеет атрибут прототипа, указывающий на прототип. Этот атрибут не может быть доступен и, конечно, не может быть изменен, потому что это основа для поддержания наследования JavaScript.
Кода -копия выглядит следующим образом:
// оператор конструктора
функция gooyansi () {}
function gooyansiex () {}
// Прототип наследования
Guoyansiex.prototype = new guoyansi ();
// Создать объект
var g1 = new guoyansiex ();
var g2 = new guoyansiex ();
Объекты в приведенном выше коде могут быть объяснены на следующем рисунке
2. Прототип обслуживания
Экземпляр, сгенерированный конструктором, чей атрибут конструктора всегда указывает на конструктор. Мы будем думать, что утверждение в настоящее время верно.
Кода -копия выглядит следующим образом:
функция gooyansi () {}
var obj1 = new guoyansi ();
console.log (obj1.constructor === Guoyansi); // true
На самом деле, у самого конструктора нет атрибута конструктора, так откуда взялся этот атрибут?
Ответ: из прототипа.
Поэтому сделаны следующие выводы
Копия кода выглядит следующим образом: obj1.constructor === Guoyansi.prototype.constructor === Guoyansi
Поскольку мы можем найти конструктор через конструктор, мы можем дополнительно улучшить вышеуказанную диаграмму.
Кода -копия выглядит следующим образом:
function gooyansiex () {}
Guoyansiex.prototype = new guoyansi ();
console.log (guoyansiex.constructor === guoyansiex) // false
Согласно приведенной выше картинке, приведенный выше результат должен быть истинным, но почему ложно?
Теперь сделайте анализ.
Прототип Guoyansiex был переписан экземпляром Guoyansi, поэтому конструктор в прототипе Guoyansiex, естественно, также является примером Guoyansi.
Конструктор в экземпляре Guoyansi происходит от Guoyansi.prototype. Тем не менее, Guoyansi.prototype не был переписан.
Таким образом, конструктор Guoyansi.prototype указывает на Guoyansi (конструктор);
Основываясь на вышеуказанном анализе, мы делаем следующие выводы
Кода -копия выглядит следующим образом: guoyansiex.constructor === Guoyansi.constructor === Guoyansi;
Если в процессе разработки в процессе разработки очень точные требования конструктора очень точны, может быть сделана следующая обработка.
Кода -копия выглядит следующим образом:
/** Метод 1: **/
функция gooyansi () {}
function gooyansiex () {}
Guoyansiex.prototype = new guoyansi ();
Guoyansiex.prototype.constructor = guoyansiex; // сбросить указатель конструктора.
Кода -копия выглядит следующим образом:
/**
Метод 2
**/
функция gooyansi () {}
функция gooyansiex () {
this.constructor = Arguments.callee;
}
Guoyansiex.prototype = new guoyansi ();
Кода -копия выглядит следующим образом:
/**
Метод 3
**/
функция gooyansi () {}
функция gooyansiex () {
this.constructor = guoyansiex;
}
Guoyansiex.prototype = new guoyansi ();
3. Каково использование невидимого прототипа?
Мы можем управлять видимой цепочкой прототипа, чтобы завершить наше наследование, поэтому мы не можем видеть и управлять этой невидимой цепочкой прототипа. Что это за использование?
Существует функция в объектно-ориентированном наследстве: сходство. Подклассы имеют сходство с родительскими классами. Поэтому в подклассах вы не можете использовать Delete для удаления участников, унаследованных от родительских классов. То есть подклассы должны иметь характеристики родительских классов.
Чтобы поддерживать эту функцию, JavaScript генерирует невидимое свойство прототипа внутри объекта и не позволяет пользователю получить к нему доступ. Таким образом, пользователь может изменить конструктор для любой цели,
Это не разрушит характеристики детского класса, имеющего родительский класс.
Короче говоря: внутренние прототипы требуются с механизмом наследования JavaScript, в то время как пользователи требуют внешних прототипов для реализации наследования.
4. __proto__ в Spidermonkey Engine Firefox
Все еще этот код.
Кода -копия выглядит следующим образом:
функция gooyansi () {}
Guoyansi.prototype.age = 24;
function gooyansiex () {}
var obj1 = new guoyansi ();
Guoyansiex.prototype = obj1;
Guoyansiex.prototype.constructor = guoyansiex; // сбросить указатель конструктора.
var obj2 = new guoyansiex ();
Теперь я хочу получить доступ к возрасту свойств прототипа родительского класса Guoyansi, начиная с OBJ.
Это идея.
Шаг 1: obj2 ====> obj2.constructor.prototype
Часть 2: obj2.constructor.prototype ===> guoyansiex.prototype;
Часть 3: guoyansiex.prototype ===> obj1;
Часть 4: obj1.constructor ====> Guoyansi
Часть 5: Guoyansi.prototype.age
Напишите это так: console.log (obj2.constructor.prototype.constructor.prototype.age) // 24;
Окончательный результат 24.
Окончательный результат составляет 24. Он может быть выполнен нормально, но во многих книгах говорится, что после изменения конструктора уровень не может найти прототип в родительском классе. Я не знаю, что происходит.
Достаточно более краткого атрибута в firefox._proto_
По умолчанию Spidermonkey добавляет атрибут с именем _proto_ к любому созданному объекту, который указывает на прототип, используемый конструктором.
На самом деле, это невидимая прототипная цепь, которую мы упомянули выше, но в этом месте это всего лишь замаскированное раскрытие.
Вы можете получить доступ к возрасту таким образом
Console.log (obj2 .__ Proto __.__ Proto __. Age); // 24
Это действительно успешно получает доступ к атрибуту прототипа родительского класса, но этот атрибут применим только к Firefox, и в других браузерах будут ошибки.
В E5 объект распространяется на object.getPrototypeof (), и вы можете получить доступ ко всем прототипам родительского класса.
Кода -копия выглядит следующим образом:
функция gooyansi () {}
Guoyansi.prototype.age = 24;
function gooyansiex () {}
var obj1 = new guoyansi ();
Guoyansiex.prototype = obj1;
Guoyansiex.prototype.constructor = guoyansiex; // сбросить указатель конструктора.
var obj2 = new guoyansiex ();
var proto = object.getPrototypeof (obj2);
while (proto) {
console.log (proto.constructor);
proto = object.getPrototypeof (proto);
}
console.log («Прототип объекта»+proto);
Результат: Guoyansiex
Гуянси
Объект
Прототип нулевой для объекта
Я лично думаю, что это следует считать одной из сущностей объектно-ориентированного JavaScript. Пожалуйста, обратитесь к нему самостоятельно и используйте его в своем собственном проекте в соответствии с вашими потребностями.