Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 14.01.2019, 17:23
Новичок на форуме
Отправить личное сообщение для JS_Johny Посмотреть профиль Найти все сообщения от JS_Johny
 
Регистрация: 01.01.2019
Сообщений: 9

Иерархия встроенных объектов
Друзья, разбираюсь с прототипами. Подскажите почему так:
1. Выходит у встроенных конструкторов Object и Function одинаковый прототип
alert( Object.__proto__ == Function.__proto__ ); // true

2. У Function вообще .__proto__ и .prototype содержат ссылку на один и тот же объект
alert( Function.__proto__ == Function.prototype ); // true

3. Почему:
Function.prototype
- функция (и для чего она используется в качестве функции???)
Object.prototype
- обычный объект
Ответить с цитированием
  #2 (permalink)  
Старый 14.01.2019, 18:25
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,583

__proto__ - это, грубо говоря, ссылка на prototype конструктора.
Смотреть __proto__ у встроенных классов никакого смысла нет, т.к. там всегда будет одно и то же.
__________________
29375, 35
Ответить с цитированием
  #3 (permalink)  
Старый 14.01.2019, 22:08
Аватар для Malleys
Профессор
Отправить личное сообщение для Malleys Посмотреть профиль Найти все сообщения от Malleys
 
Регистрация: 20.12.2009
Сообщений: 1,714

Сообщение от JS_Johny
у встроенных конструкторов Object и Function одинаковый прототип
У них одинаковый конструктор. Конструктором у конструкторов Object и Function является конструктор Function. Да, Object и Function — это функции, вы их можете вызывать.
alert(Function.constructor === Object.constructor)
alert(Function.constructor === Function)
Мы можем рассматривать Object, Function, и другие классы, например, Array или собственный класс Person, как представителей класса Function.

Например, класс Person можно описать так...
function Person(name, age) {
	this.name = name;
	this.age = age;
}
и такой класс тоже является представителем класса Function. Ведь такая запись является, в некотором смысле, синтаксическим сахаром для следующего кода...
var Person = new Function("name", "age", "this.name = name; this.age = age;");


По умолчанию все классы наследуют от Object. Например, рассмотрев массив, мы увидим, что он является представителем класса Array и наследует от Object.
alert(["a","b"].constructor)// на самом деле оно пошло смотреть ["a","b"].__proto__.constructor

alert(["a","b"].__proto__.constructor)

alert(["a","b"].__proto__.__proto__.constructor)

alert(["a","b"] instanceof Array && ["a","b"] instanceof Object)


Но мы можем захотеть не наследовать от Object, вообще не наследовать.
function Empty() {}
Empty.prototype = {
	constructor: Empty,
	__proto__: null
};

// если взглянуть в консоль, то видно, что у представителя класса Empty нет свойств, которые обычно наследуются от Object
console.log(new Empty());


Сообщение от JS_Johny
У Function вообще .__proto__ и .prototype содержат ссылку на один и тот же объект
да, поскольку Function является представителем класса Function
alert(Function.prototype === Function.__proto__);
alert(Function.__proto__.constructor === Function);
alert(Function instanceof Function === true)


Сообщение от JS_Johny
Почему... Function.prototype — функция?
Его конструктор — функция. Т. е. если мы создадим представителя класса функции, то мы получим функцию!

Вот схема, показывающая, отношения объекта и функции.

Чтобы узнать собственные свойства объекта, используйте статичный метод Object.getOwnPropertyNames
console.log(Object.getOwnPropertyNames(["a","b"]));

Чтобы посмотреть, на что ссылается внутреннее свойство [[Prototype]], используйте статичный метод Object.getPrototypeOf
console.log(Object.getOwnPropertyNames(Object.getPrototypeOf(["a","b"])));


Сообщение от Aetae
Смотреть __proto__ у встроенных классов никакого смысла нет, т.к. там всегда будет одно и то же.
Посмотрите типизированные массивы, генераторы, асинхронные функции, т. е. они не наследуют напрямую от Object.

console.log(Uint16Array.prototype.__proto__.constructor);
console.log(Float64Array.prototype.__proto__.constructor);
console.log((function*(){}).constructor.prototype.__proto__.constructor);
console.log((async function*(){}).constructor.prototype.__proto__.constructor);
console.log((async ()=>{}).constructor.prototype.__proto__.constructor);
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
иерархия объектов javascript и prototype skrudjmakdak Events/DOM/Window 6 05.07.2013 19:57
Прототипы встроенных объектов cyber Events/DOM/Window 3 07.09.2012 08:53
Как найти точки соприкосновения двух объектов в RaphaelJS Fatalityap Библиотеки/Тулкиты/Фреймворки 3 03.08.2012 16:33
ООП: как создавать наследника от встроенных объектов? Langalier Общие вопросы Javascript 17 02.02.2009 17:07