Pull to refresh

Javascript Object Layout

Reading time2 min
Views2.4K
Далее пойдет речь об иерархии объектов в JavaScript.


JOL

Источник: 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 не существует как конструктор в своей собственной цепочке прототипов.
Tags:
Hubs:
+1
Comments20

Articles

Change theme settings