1. Прототип объект
1.1 минусы конструкторов
JavaScript генерирует новые объекты через конструкторы, поэтому конструкторы можно рассматривать как шаблоны для объектов. Свойства и методы объекта экземпляра могут быть определены внутри конструктора.
Функция Cat (имя, цвет) {this.name = name; this.color = color;} var cat1 = new Cat ('Big Hair', 'White'); Cat1.name // 'Big Hair'cat1.color //' White 'Функция CAT в приведенном выше коде является конструктором. Атрибут имени и атрибут цвета определены внутри. Все объекты экземпляра будут генерировать эти два атрибута. Однако это является пустой тратой системных ресурсов, потому что свойства не могут быть переданы между экземплярами объекта того же конструктора.
Функция Cat (имя, цвет) {this.name = name; this.color = color; this.meow = function () {console.log ('mew, mew, mew ...'); };} var cat1 = new Cat ('большие волосы', 'белый'); var cat2 = new cat ('ei mao', 'black'); cat1.meow === cat2.meow // falseВ приведенном выше коде Cat1 и Cat2 являются экземплярами того же конструктора. Тем не менее, их методы мяука отличаются, то есть каждый раз, когда создается новый экземпляр, будет создан новый метод мяу. Это не необходимо и не тратят системные ресурсы, потому что все методы мяу -мяука являются одним и тем же поведением и должны быть полностью разделены.
1.2 Роль атрибута прототипа
На языке JavaScript каждый объект имеет соответствующий объект прототипа, называемый объектом прототипа. Все свойства и методы, определенные на объекте прототипа, могут быть унаследованы полученным объектом. Это основной дизайн механизма наследования JavaScript.
В дополнение к этому подходу JavaScript также предоставляет еще один способ определения объектов экземпляра. Мы знаем, что конструктор - это функция, объект, а также имеет свои собственные свойства и методы. Один атрибут прототипа указывает на другой объект, который обычно называют объектом прототипа. Этот объект очень особенный. Пока свойства и методы, определенные на нем, могут быть разделены всеми объектами экземпляра. То есть, когда конструктор генерирует объект экземпляра, атрибут прототипа автоматически назначается объекту экземпляра.
Функция животного (имя) {this.name = name;} Animal.prototype.color = "White"; var cat1 = новое животное ('большие волосы'); var cat2 = новое животное ('erimao'); cat1.color // 'white'cat2.color //' белыйПриведенный выше код добавляет цветный атрибут к объекту прототипа животного конструктора. В результате оба экземпляра объектов Cat1 и Cat2 несут это свойство.
В частности, до тех пор, пока объект прототипа будет изменен, изменения будут немедленно отражены в объекте экземпляра.
Animal.prototype.color = "желтый"; cat1.color // 'hellow'cat2.color //' желтый
Приведенный выше код изменяет значение атрибута цвета объекта прототипа на желтый, а значение цвета цвета двух экземпляров объектов немедленно изменится. Это связано с тем, что объект экземпляра на самом деле не имеет цветного атрибута, и все они читают цветный атрибут объекта прототипа. То есть, когда сам объект экземпляра не имеет определенного свойства или метода, он перейдет в объект прототипа конструктора, чтобы найти свойство или метод. Это особая вещь о прототипе объектов.
Если сам объект экземпляра имеет определенное свойство или метод, он больше не будет искать это свойство или метод в объекте прототипа.
cat1.color = 'black'; cat2.color // 'jollow'animal.prototype.color // "желтый";
Приведенный выше код изменяет свойство цвета энтеса -объекта CAT1 на черный, поэтому ему больше не нужно читать свойство цвета из объекта прототипа, а значение последнего все еще желтое.
Короче говоря, функция объекта прототипа состоит в том, чтобы определить свойства и методы, разделяемые всеми объектами экземпляра, поэтому он также называется прототипом объекта экземпляра, и объект экземпляра может рассматриваться как полученное из объекта прототипа.
Animal.prototype.walk = function () {console.log (this.name + 'hokd.');};Приведенный выше код определяет метод ходьбы на Animal.Protype, который будет вызван ко всем объектам экземпляра животного.
1.3 Прототип цепочки
Поскольку все объекты в JavaScript имеют конструкторы, и все конструкторы имеют атрибуты прототипа (на самом деле все функции имеют атрибуты прототипа), все объекты имеют свои собственные прототипные объекты.
Следовательно, свойства и методы объекта могут быть определены на себе или на его объекте прототипа (например, метод ходьбы в приведенном выше коде). Поскольку сам прототип является объектом и имеет свой собственный прототип, создается цепочка прототипа. Например, объект A является прототипом объекта B, объект B является прототипом объекта C и т. Д. Поскольку отслеживание корня источника, объекты в источнике генерируются из конструктора объекта (с использованием команды New Object ()), поэтому, если вы проследите его слой по слою, прототип всех объектов может быть в конечном итоге проследить до объекта. Прототип. Итак, есть ли прототип для Object.Prototype? Ответ может быть да или нет, потому что прототип объекта. Прототип является нулевым без каких -либо свойств и методов.
Object.getPrototypeof (object.prototype) // null
Приведенный выше код указывает на то, что прототип объекта. Прототип объект является нулевым. Поскольку NULL не имеет свойств, цепь прототипа заканчивается здесь.
Функция «прототипа цепочки» состоит в том, что при чтении определенного атрибута объекта двигатель JavaScript сначала ищет атрибуты самого объекта. Если его нельзя найти, он будет искать свой прототип. Если его все еще не найден, он будет искать прототип прототипа. И так далее, если объект. Прототип на верхнем уровне все еще не найден, он возвращает неопределенную.
Например, если атрибут прототипа функции указывает на массив, это означает, что функция может использоваться в качестве конструктора массива, поскольку объекты экземпляра, которые он генерирует, могут вызвать метод массива через атрибут прототипа.
Функция myarray () {} myarray.prototype = new Array (); myarray.prototype.constructor = myarray; var mine = new myArray (); mine.push (1, 2, 3); mine.length // 3mine exantemon of Marray // trueШахта в приведенном выше коде является объектом экземпляра Myarray. Поскольку свойство прототипа Myarray указывает на массив, моя может вызовать методы массива (эти методы фактически определены на объекте прототипа массива). Что касается последней линии экземпляра выражения, мы знаем, что оператор экземпляра используется для сравнения, является ли объект экземпляром конструктора, и последняя строка указывает, что шахта является экземпляром массива.
Шахта массива // эквивалентен (array === myarray.prototype.constructor) || (Array === Array.prototype.constructor) || (Array === Object.prototype.constructor)
Приведенный выше код иллюстрирует суть оператора экземпляра, который сравнивается с атрибутами конструктора всех объектов прототипа объекта экземпляра (для введения этого атрибута см. В следующем разделе). До тех пор, пока он есть, он вернет True, в противном случае он вернет ложь.
1.4 Атрибут конструктора
Объект прототипа имеет атрибут конструктора, который указывает на функцию конструктора, где объект прототипа расположен по умолчанию.
Функция p () {} p.prototype.constructor === p // trueПоскольку атрибут конструктора определяется на объекте прототипа, это означает, что он может быть унаследован всеми объектами экземпляра.
Функция p () {} var p = new p (); p.constructor // function p () {} p.constructor === p.prototype.constructor // truep.hasownproperty ('constructor') // falseПриведенный выше код указывает на то, что P является объектом Encement Constructor P, но сам P не имеет атрибута конструктора, который фактически читает атрибут P.Prototype.Constructor в цепочке прототипа.
Функция атрибута конструктора состоит в том, чтобы отличить, на какую конструктор определяется объект прототипа.
Функция f () {}; var f = new f (); f.constructor === f // truef.constructor === regexp // falseПриведенный выше код означает, что использование свойства конструктора определяется, что функция конструктора переменной F - это F, а не regexp.
2.object.getPrototypeof Method
Метод object.getPrototypof возвращает прототип объекта.
// Прототип пустого объекта - это object.prototypection.getPrototypeof ({}) === object.prototype // true // Прототип функции - функция. IS F.Prototyparevar f = new f (); object.getPrototypeof (f) === f.prototype // true3.Object.create Метод
Метод Object.Create используется для генерации нового объекта и может заменить новую команду. Он принимает объект в качестве аргумента и возвращает новый объект, который полностью наследует свойства первого, то есть первое становится прототипом последнего.
var o1 = {p: 1}; var o2 = object.create (o1); o2.p // 1В приведенном выше коде метод Object.Create генерирует O2 на основе O1. В настоящее время O1 становится прототипом O2, то есть O2 наследует все свойства O1.
Метод Object.Create в основном эквивалентен следующему коду. Если старый браузер не поддерживает метод object.create, вы можете использовать следующий код для развертывания самостоятельно.
if (typeof object.create! == "function") {object.create = function (o) {function f () {} f.prototype = o; вернуть новый f (); };}Приведенный выше код показывает, что метод object.create, по сути, создает новый конструктор F, а затем позволяет атрибуту прототипа F к объекту O в качестве прототипа и, наконец, возвращает экземпляр F, так что экземпляр может наследовать атрибуты O.
Новые объекты, сгенерированные следующими тремя способами, эквивалентны.
var o1 = object.create ({}); var o2 = object.create (object.prototype); var o3 = new object ();Если вы хотите сгенерировать объект, который не наследует какие -либо свойства (например, ToString и значение методов), вы можете установить объект. Параметр Create на NULL.
var o = object.create (null); o.valueof () // typeerror: object [объект объекта] не имеет метода 'valueof'
Приведенный выше код указывает, что если прототип объекта o является нулевым, он не обладает некоторыми свойствами, определенными на объекте. Прототип объект, такой как метод значения.
При использовании метода object.create должен быть предоставлен прототип объекта, в противном случае сообщается об ошибке.
Object.create () // typeerror: Прототип объекта может быть только объектом или нулевым
Новый объект, генерируемый методом Object.Create Динамически наследует прототип. Добавление или изменение любого метода на прототипе немедленно будет отражать новый объект.
var o1 = {p: 1}; var o2 = object.create (o1); o1.p = 2; o2.p // 2Приведенный выше код указывает на то, что изменение прототипа объекта повлияет на недавно сгенерированный объект.
В дополнение к прототипу объекта, метод object.create также может принять второй параметр, представляющий объект атрибутов, описывающий атрибуты, который является тем же форматом, что и используемый метод object.defineproperties. Свойства объекта, которые он описывает, будут добавлены в новый объект.
var o = object.create (object.prototype, {p1: {value: 123, enumerable: true}, p2: {value: "abc", перечисленность: true}}); o.p1 // 123o.p2 // "abc"Поскольку метод object.create не использует конструктор, оператор экземпляра не может быть использован для определения того, какой экземпляр конструктора является объектом. В настоящее время вы можете использовать следующий метод iSprototypeof для интерпретации, какой объект является прототипом.
4. Isprototypeof Method
Метод ISPrototypeof используется для определения того, является ли объект прототипом другого объекта.
var o1 = {}; var o2 = object.create (o1); var o3 = objПриведенный выше код показывает, что iSprotypeOf возвращает истину, пока объект находится в цепочке прототипа.
5. Простой пример
var classdemo = function () {// статическая частная переменная var private_static_var = 'aaaa'; // Статический частный метод var private_static_func = function (key) {return key + private_static_var; } // Приватный метод, ключ состоит в том, чтобы передать этот var private_func = function (self, key) {return private_static_func (key + self.id); } var _class = function (id) {// constructor this.id = id; // public variable} // public method_class.prototype.public_func = function (key) {return private_func (this, key); } return _class;} (); var a = new classdemo ('hello world'); alert (a.public_func ('world hello'));Нет простого способа реализации личных переменных и общественных статических переменных/методов, но инкапсуляция достаточно, чтобы быть сделанной в этой степени.