Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   функции - это обьекты (https://javascript.ru/forum/misc/64214-funkcii-ehto-obekty.html)

bialand 27.07.2016 17:07

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

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

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

p.s. неспрашивайтезачеммнеэтоя самнезнаю

Erolast 27.07.2016 21:45

Цитата:

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

Цитата:

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

Цитата:

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

Цитата:

Элементарно, сделай те же методы что и у функции
Аха, а вызывать ее как?

Erolast 28.07.2016 08:35

Цитата:

Это всего лишь абстракция вызова для описания работы функции увы...
Какая еще абстракция? Это реальный внутренний метод объектов - 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

Как?

Яростный Меч 28.07.2016 12:09

Цитата:

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

странный вопрос.

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

Как здесь уже предлагается, можно добавить методы call и apply
но им ведь нужна некая функция, чтобы её вызывать. Сам объект они вызвать не смогут. Смогут, например, некую функцию в составе объекта, но это не "превращение", а скорее обертка.

Яростный Меч 28.07.2016 12:10

и разумеется, никак нельзя сделать, чтобы вызывать х()

Erolast 28.07.2016 18:04

Цитата:

var func = new Object(null);
func.call = function() {};
func.apply = function() {};

Не тупо их позаимствовать, а реализовать функционально, никто и не говорил что будет легко, но утку сделать реально...
Поздравляю, ты изобрел ООП. Взял обычную функцию и запихал в объект.
Вот только задача ТС не выполнена - func.apply точно так же наследует от Function и имеет все его свойства.

Erolast 28.07.2016 18:07

Цитата:

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

hello.__proto__ = null;

Но нахера? Зачем ты борешься с языком? :blink:

bialand 29.07.2016 13:05

Цитата:

Erolast "Чего-чего? Чем проще?"
не надо использовать hasOwnProperty тем более, что в пртотипе его могут переопределить hello.__proto__.hasOwnProperty=88; (какие нибудь злые библиотеки)
Цитата:

new Function
я её использую только для редких неизвестных заранее функций

Цитата:

hello.__proto__ = null;
мне это нравится
Цитата:

Но нахера? Зачем ты борешься с языком?
я пытаюсь понять где граница между зоной действия javascript и native code

Erolast 29.07.2016 16:28

Цитата:

не надо использовать hasOwnProperty
а... на объектах? А где ты его используешь?

Цитата:

тем более, что в пртотипе его могут переопределить hello.__proto__.hasOwnProperty=88; (какие нибудь злые библиотеки)
Те же самые библиотеки могут переопределить window.Object и твой код все равно не будет работать.
Не стоит равняться на идиотов. Серьезно, никто так не делает) Хочешь перестраховаться - просто не используй непопулярные либы; скажем, у которых меньше ста звезд на гитхабе.

Цитата:

я её использую только для редких неизвестных заранее функций
На самом деле, единственные кейсы использования Function/eval - исполнение пользовательского кода и трансляция в живом режиме (в том числе шаблонов).
Возможно, ты незнаком с замыканиями и пытаешься использовать new Function на их месте. Не надо так. Изучи замыкания, это мощь JS.

Цитата:

я пытаюсь понять где граница между зоной действия javascript и native code
Это молодец) Но не надо употреблять такое на практике. Язык надо использовать таким образом, как его проектируют. Не получается - лучше не использовать вообще, как-нибудь в будущем еще вернешься.


Часовой пояс GMT +3, время: 07:04.