Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #11 (permalink)  
Старый 07.01.2021, 19:44
Аватар для voraa
Профессор
Отправить личное сообщение для voraa Посмотреть профиль Найти все сообщения от voraa
 
Регистрация: 03.02.2020
Сообщений: 2,750

А откуда у нашей fun взялся метод apply?
Все оттуда же. Функция - объект
Любая функция создается с помощью (неявного) вызова new Function()
Мы написали
function fun() {...}

На самом деле получили
var fun = new Function(....)


Function - встроенная функция JS. Как и любая функция она содержит свойство prototype
Function.prototype = {
   constructor: Function,
// и прочие методы
   apply: function () {...},
   call: function () {...},
   bind: function () {...},
.....
}


Когда вызвался fun = new Function (...)
как и для всех объектов произошло
fun.__proto__ = Function.prototype;

Поэтому методы apply, call, bind... стали доступны для fun
Ответить с цитированием
  #12 (permalink)  
Старый 07.01.2021, 20:58
Аватар для voraa
Профессор
Отправить личное сообщение для voraa Посмотреть профиль Найти все сообщения от voraa
 
Регистрация: 03.02.2020
Сообщений: 2,750

На самом деле все немного сложнее.
У объектов нет никакого свойства __proto__. Есть внутреннее, недоступное из программ свойство [[Prototype]]. А __proto__ это getter/setter из Object.prototype - системные функции JS, которые могут получать/менять [[Prototype]] объектов. Они доступны из объектов через цепочку прототипов. Если она не нарушена.
let op = {
	x: 1,
	y: 2
};

let o ={};
o.__proto__ = op;

console.log (o.__proto__); // {x:1, y:2} здесь идет обращение к Object.prototype get __proto__
console.log (o.x, o.y); // 1 2   это из прототипа

o.__proto__ = null;

console.log (o.x, o.y); // undefined undefined  т.к. нет прототипа

o.__proto__ = op;

console.log (o.__proto__) // по прежнему {x:1, y:2} но это не прототип! это обычное свойство __proto__
console.log (o.x, o.y); // и по прежнему undefined undefined т.к. нет прототипа. И никогда не будет.


Написав o.__proto__ = null, мы нарушили цепочку прототипов. Из нашего объекта теперь невозможно добраться до Object.prototype и нет доступа к setter __proto__. Поэтому, когда мы снова пишем o.__proto__ = op, то не меняем прототип [[Prototype]], а просто создаем обычное свойство с именем __proto__. Оно ссылается на op, но это не имеет никакого отношения к прототипу объекта

Последний раз редактировалось voraa, 07.01.2021 в 21:11.
Ответить с цитированием
  #13 (permalink)  
Старый 08.01.2021, 01:58
Аватар для MallSerg
Профессор
Отправить личное сообщение для MallSerg Посмотреть профиль Найти все сообщения от MallSerg
 
Регистрация: 07.03.2011
Сообщений: 1,138

>>
Сообщение от denis_alekss
Сообщение от MallSerg
>>
И изучи из чего состоит полученный объект.

ff = function fun (){};
f = new ff();

console.dir(f);
Этот объект состоит из:

1. функции fun
2. конструктора fun
3. __proto__ ссылается на функцию-класс с помощью которого он был создан, то есть на функцию fun.
4. Сама функция fun ссылается на Object.prototype
Я привет пример кода выполнив который в консоли браузера ты должен был получить в ответ объект.

Приведенный пример кода состоит из трех строк каждая из которых является выражением.
1. используется функциональное выражение (function fun (){})
для создания функционального объекта и присваивание(взятие ссылки) его переменной ff.
ff хранит ссылку на функциональный объект который можно вызвать как функцию используя эту ссылку ff.
2. Вызов по ссылке(ff) функции(fun) как конструктора для нового объекта типа (fun) и сохранение полученного нового объекта в переменную f
3. команда консоли вывести объект на который ссылается переменная f.

>> Конструктор как выглядит здесь?
Здесь в роли конструктора выступает функция fun (function fun (){}; )
Любой функциональный объект в JavaScript может быть использован как функция конструктора.
В JavaScript нет разницы между функциями и конструкторами.

>> Он создается для потомков?
Для создания потомков конструктор не нужен т.к. ему нечего и незачем конструировать.
Наследникам для получения наследства в виде свойств и методов достаточно просто стать наследниками.
т.е. указать ссылкой на свой прототип.

ИМХО твоя проблема в том что абстракции и понятия используемые в компилируемых языках где требуются описания различных классов объектов и описанию по их построению(конструкторы/деструкторы) ты пытаешься использовать в JavaScript и приходишь к противоречиям и непоняткам ставящим тебя в тупик непонимания.
JavaScript это другой язык построенный на отличающихся абстракциях и понятиях.
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
иерархия объектов javascript и prototype skrudjmakdak Events/DOM/Window 6 05.07.2013 19:57
Книга: JavaScript. Сильные стороны Magneto Учебные материалы 16 21.04.2013 15:28
Интерпретатор Java на JS kobezzza Оффтопик 24 11.10.2012 18:32
Последние книги по JavaScript! monolithed Учебные материалы 7 26.10.2010 19:40
Выдвет ошибку JavaScript Ромио Opera, Safari и др. 4 21.10.2010 20:34