Далее пойдет речь об иерархии объектов в JavaScript.
Источник: www.mollypages.org/misc/js.mp
Далее идут выдержки из текста и они могут быть «мутными», поэтому я сразу предлагаю не ругаться, а лучше просто поизучать приведенную диаграмму, ибо ради нее и публикуется статья. Т.е. можно дальше и не читать, но если все таки прочтете и увидете явные несоответствия и сможете их аргументировать, то добро пожаловать на обсуждение в комментариях…
Итак перевод:
— Все экземпляры наследуются от прототипа объекта функции, которая их создала.
— Mozilla/Konqueror имеет встроенное свойство __proto__, которое указывает на прототип объекта функции-создателя.
— Независимо от наличия/отсутствия свойства __proto__, основная идея заключается в том, что все объекты используют прототип объекта на который указывает функция-создатель. Прототип объекта по-умолчанию имеет свойство constructor, указывающее обратно на функцию-создатель прототипа.
— Прототип может быть использован только для унаследованных свойств функции. Сама функция не использует ассоциированный прототип!
function foo() {}; var f1 = new foo();
foo.prototype.x = «hello»;
console.log(f1.x); // hello
console.log(foo.x); // undefined
— Прототип объекта по-умолчанию может быть заменен любым другим объектом, созданным пользователем. Свойство constructor при этом должно быть вручную заменено на другое:
function foo() {}; var f1 = new foo();
console.log('исходное >',f1.constructor, foo.prototype.constructor, foo, f1.constructor === foo, foo.prototype.constructor === foo);
foo.prototype.constructor = Object;
console.log('замена прототипа >',f1.constructor, foo.prototype.constructor, Object, f1.constructor === Object, foo.prototype.constructor === Object);
foo.prototype.constructor = foo
console.log('обратно >',f1.constructor, foo.prototype.constructor, foo, f1.constructor === foo, foo.prototype.constructor === foo);
— все объекты автоматически читают свойства прототипов по цепочке от собственных до родительских.
function foo() { }; f1 = new foo(); f2 = new foo();
foo.prototype.x = «hello»;
console.log(f1.x); // «hello»
console.log(f2.x); // «hello»
f1.x = «goodbye»; // установка f1.x «перекрывает» foo.prototype.x Только для f1
console.log(f1.x); // «goodbye»
console.log(f2.x); // «hello»
delete f1.x // удаление локального свойства
console.log(f1.x) // «hello»… foo.prototype.x обратно «видимо» для f1
// Установка свойства непосредственно в прототип изменяет значение во всех экземплярах.
foo.prototype.x = «goodbye»;
console.log(f1.x); // «goodbye»
console.log(f2.x); // «goodbye»;
На приведенной диаграмме можно увидеть, что:
— Function.__proto__ указывает на Function.prototype. Соответственно: Function.constructor === Function Конструктор функции есть функция.
— Object instanceof Object == true. исходя из того, что Object.__proto__.__proto__.constructor == Object
Но, Foo instanceof Foo == false. Потому, что Foo не существует как конструктор в своей собственной цепочке прототипов.
Источник: www.mollypages.org/misc/js.mp
Далее идут выдержки из текста и они могут быть «мутными», поэтому я сразу предлагаю не ругаться, а лучше просто поизучать приведенную диаграмму, ибо ради нее и публикуется статья. Т.е. можно дальше и не читать, но если все таки прочтете и увидете явные несоответствия и сможете их аргументировать, то добро пожаловать на обсуждение в комментариях…
Итак перевод:
— Все экземпляры наследуются от прототипа объекта функции, которая их создала.
— Mozilla/Konqueror имеет встроенное свойство __proto__, которое указывает на прототип объекта функции-создателя.
— Независимо от наличия/отсутствия свойства __proto__, основная идея заключается в том, что все объекты используют прототип объекта на который указывает функция-создатель. Прототип объекта по-умолчанию имеет свойство constructor, указывающее обратно на функцию-создатель прототипа.
— Прототип может быть использован только для унаследованных свойств функции. Сама функция не использует ассоциированный прототип!
function foo() {}; var f1 = new foo();
foo.prototype.x = «hello»;
console.log(f1.x); // hello
console.log(foo.x); // undefined
— Прототип объекта по-умолчанию может быть заменен любым другим объектом, созданным пользователем. Свойство constructor при этом должно быть вручную заменено на другое:
function foo() {}; var f1 = new foo();
console.log('исходное >',f1.constructor, foo.prototype.constructor, foo, f1.constructor === foo, foo.prototype.constructor === foo);
foo.prototype.constructor = Object;
console.log('замена прототипа >',f1.constructor, foo.prototype.constructor, Object, f1.constructor === Object, foo.prototype.constructor === Object);
foo.prototype.constructor = foo
console.log('обратно >',f1.constructor, foo.prototype.constructor, foo, f1.constructor === foo, foo.prototype.constructor === foo);
— все объекты автоматически читают свойства прототипов по цепочке от собственных до родительских.
function foo() { }; f1 = new foo(); f2 = new foo();
foo.prototype.x = «hello»;
console.log(f1.x); // «hello»
console.log(f2.x); // «hello»
f1.x = «goodbye»; // установка f1.x «перекрывает» foo.prototype.x Только для f1
console.log(f1.x); // «goodbye»
console.log(f2.x); // «hello»
delete f1.x // удаление локального свойства
console.log(f1.x) // «hello»… foo.prototype.x обратно «видимо» для f1
// Установка свойства непосредственно в прототип изменяет значение во всех экземплярах.
foo.prototype.x = «goodbye»;
console.log(f1.x); // «goodbye»
console.log(f2.x); // «goodbye»;
На приведенной диаграмме можно увидеть, что:
— Function.__proto__ указывает на Function.prototype. Соответственно: Function.constructor === Function Конструктор функции есть функция.
— Object instanceof Object == true. исходя из того, что Object.__proto__.__proto__.constructor == Object
Но, Foo instanceof Foo == false. Потому, что Foo не существует как конструктор в своей собственной цепочке прототипов.