Javascript.RU

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

функции - это обьекты
В javascript на сколько я понял все переменные могут быть либо примитивами, либо объектами. А функции это тоже объекты у которых скрытое свойство отвечающее за тип объекта условно равно = "функция", и есть еще скрытые методы типа "call".

Недавно я перешел с "var x={}" на "var x = Object.create(null)" в связи с тем что с независимым(чистым) объектом проще работать.

Теперь же я заметил что после
var f = new Function(paramVariable,bodyVariable)
объект f, хоть он и 'функция' все равно обладает своством 'prototype' и другими.
Как думаете можно ли объект
var x = Object.create(null)
превратить в функцию ? (очень сомнительно);
Или есть способ от функции отрезать ее родителей?

p.s. неспрашивайтезачеммнеэтоя самнезнаю
Ответить с цитированием
  #2 (permalink)  
Старый 27.07.2016, 18:44
Профессор
Отправить личное сообщение для Rise Посмотреть профиль Найти все сообщения от Rise
 
Регистрация: 07.11.2013
Сообщений: 4,662

Сообщение от bialand Посмотреть сообщение
есть еще скрытые методы типа "call".
Он не скрытый вполне открытый, и в упрощенном виде выглядит так (), а в продвинутом так apply()

Сообщение от bialand Посмотреть сообщение
все равно обладает своством 'prototype'
Так это свойство и есть только у функций

Сообщение от bialand Посмотреть сообщение
превратить в функцию ?
Элементарно, сделай те же методы что и у функции
Ответить с цитированием
  #3 (permalink)  
Старый 27.07.2016, 21:45
Аватар для Erolast
Профессор
Отправить личное сообщение для Erolast Посмотреть профиль Найти все сообщения от Erolast
 
Регистрация: 24.09.2013
Сообщений: 1,436

Цитата:
Недавно я перешел с "var x={}" на "var x = Object.create(null)" в связи с тем что с независимым(чистым) объектом проще работать.
Чего-чего? Чем проще?

Цитата:
new Function
Не надо так делать, js-движки не будут оптимизировать такой код. Класс Function не используется напрямую.

Цитата:
Он не скрытый вполне открытый
У любой функции есть внутренний метод [[Call]], который, собственно, отвечает за ее исполнение. Все верно bialand сказал.

Цитата:
Элементарно, сделай те же методы что и у функции
Аха, а вызывать ее как?
Ответить с цитированием
  #4 (permalink)  
Старый 27.07.2016, 23:25
Профессор
Отправить личное сообщение для Rise Посмотреть профиль Найти все сообщения от Rise
 
Регистрация: 07.11.2013
Сообщений: 4,662

Сообщение от Erolast Посмотреть сообщение
У любой функции есть внутренний метод [[Call]], который, собственно, отвечает за ее исполнение.
Это всего лишь абстракция вызова для описания работы функции увы...
Сообщение от Erolast Посмотреть сообщение
Аха, а вызывать ее как?
Как и функцию так например object.call() или так object.apply()
Ответить с цитированием
  #5 (permalink)  
Старый 28.07.2016, 08:35
Аватар для Erolast
Профессор
Отправить личное сообщение для Erolast Посмотреть профиль Найти все сообщения от Erolast
 
Регистрация: 24.09.2013
Сообщений: 1,436

Цитата:
Это всего лишь абстракция вызова для описания работы функции увы...
Какая еще абстракция? Это реальный внутренний метод объектов - http://www.ecma-international.org/ecma-262/7.0/#table-6, http://www.ecma-international.org/ec...-argumentslist. Собственно, если его нет, то любая попытка вызвать "функцию" выбросит ошибку - http://www.ecma-international.org/ec...sec-iscallable

Цитата:
Как и функцию так например object.call() или так object.apply()
var func = new Object(null);
var realFunc = function(){console.log("Hello!")};

func.apply = realFunc.apply;

func.apply(10); //Exception: TypeError: Function.prototype.apply called on incompatible Object

Как?

Последний раз редактировалось Erolast, 28.07.2016 в 08:42.
Ответить с цитированием
  #6 (permalink)  
Старый 28.07.2016, 11:13
Профессор
Отправить личное сообщение для Rise Посмотреть профиль Найти все сообщения от Rise
 
Регистрация: 07.11.2013
Сообщений: 4,662

Сообщение от Erolast Посмотреть сообщение
Как?
Сделать те же методы что и у функции:
var func = new Object(null);
    func.call = function() {};
    func.apply = function() {};

Не тупо их позаимствовать, а реализовать функционально, никто и не говорил что будет легко, но утку сделать реально...
Ответить с цитированием
  #7 (permalink)  
Старый 28.07.2016, 12:09
Профессор
Отправить личное сообщение для Яростный Меч Посмотреть профиль Найти все сообщения от Яростный Меч
 
Регистрация: 12.04.2010
Сообщений: 557

Сообщение от bialand Посмотреть сообщение
Как думаете можно ли объект
var x = Object.create(null)
превратить в функцию ? (очень сомнительно);
странный вопрос.

функция где-то внутри содержит некоторый набор действий, объект такого набора не содержит.

Как здесь уже предлагается, можно добавить методы call и apply
но им ведь нужна некая функция, чтобы её вызывать. Сам объект они вызвать не смогут. Смогут, например, некую функцию в составе объекта, но это не "превращение", а скорее обертка.
Ответить с цитированием
  #8 (permalink)  
Старый 28.07.2016, 12:10
Профессор
Отправить личное сообщение для Яростный Меч Посмотреть профиль Найти все сообщения от Яростный Меч
 
Регистрация: 12.04.2010
Сообщений: 557

и разумеется, никак нельзя сделать, чтобы вызывать х()
Ответить с цитированием
  #9 (permalink)  
Старый 28.07.2016, 18:04
Аватар для Erolast
Профессор
Отправить личное сообщение для Erolast Посмотреть профиль Найти все сообщения от Erolast
 
Регистрация: 24.09.2013
Сообщений: 1,436

Цитата:
var func = new Object(null);
func.call = function() {};
func.apply = function() {};

Не тупо их позаимствовать, а реализовать функционально, никто и не говорил что будет легко, но утку сделать реально...
Поздравляю, ты изобрел ООП. Взял обычную функцию и запихал в объект.
Вот только задача ТС не выполнена - func.apply точно так же наследует от Function и имеет все его свойства.
Ответить с цитированием
  #10 (permalink)  
Старый 28.07.2016, 18:07
Аватар для Erolast
Профессор
Отправить личное сообщение для Erolast Посмотреть профиль Найти все сообщения от Erolast
 
Регистрация: 24.09.2013
Сообщений: 1,436

Цитата:
Или есть способ от функции отрезать ее родителей?
Есть.
function hello() {
  console.log("Hello, world!");
}

hello.__proto__ = null;

Но нахера? Зачем ты борешься с языком?
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Перевернулся мир в моей голове. pshcolnyy Общие вопросы Javascript 3 17.07.2014 08:32
Изменение прототипа функции tsigel Общие вопросы Javascript 11 15.05.2014 01:03
Лексическая структура JavaScript, раскройте тему более подробно Damir Общие вопросы Javascript 7 24.03.2013 10:07
Кто как учит/учил/ будет учить Английский ? DjDiablo Оффтопик 53 18.12.2012 21:01
динамическое содержимое функции alfmaster Общие вопросы Javascript 2 28.05.2011 17:10