Ответ 1
Мотивация для этого вопроса связана с желанием создать объекты, которые наследуются от функции.
Кажется, что вы пытаетесь сделать следующее:
- Создание новых объектов
- Установите прототип этих объектов (или свойство
__proto__
) для ссылки на Fuction.prototype, чтобы они наследовали свойства изFunction.prototype
, например:-
.apply
-
.call
-
.bind
-
Вам не нужно менять прототип объектов, если вы можете правильно установить его на нужную ссылку во время создания объекта.
Ответ один: установка прототипа объекта
Вы можете установить прототип любых объектов при создании с помощью Object.create()
. Обратите внимание, что назначение прототипа объекта Function.prototype
не приведет к тому, что объект будет вызываемой функцией. Но если вы все еще хотите назначить прототип для ссылки на Function.prototype
или на какой-либо другой объект, вы можете сделать следующее:
var obj1 = Object.create(Function.prototype);
Это будет:
- Создайте новый объект
obj1
- Задайте свой прототип (или свойство
__proto__
) для ссылки наFunction.prototype
или любой другой объект, который вы передаете в качестве аргумента- то есть делегирует неудачные поиски свойств
Function.prototype
через цепочку прототипов (это прототип JavaScript и что__proto__
означает: место для делегирования неудачных поисков свойств)
- то есть делегирует неудачные поиски свойств
Это не требует использования Object.setPrototypeOf()
для изменения прототипа существующего объекта, поскольку он назначает прототип в момент создания объекта. Для получения дополнительных примеров и информации см. Документы MDN для Object.create() - это не несет те же страшные предупреждения, что и setPrototypeOf()
. Вы можете использовать Object.create()
для установки любого нового прототипа объекта.
Ответ два: функции уже являются объектами
Тем не менее, если вы хотите, чтобы объект, который ведет себя как функция, вы можете просто создать функцию. Функция все еще является объектом, но с дополнительными функциональными свойствами и поведением; вы все равно можете относиться к нему как к объекту, присваивая ему свойства. Если вы хотите создать функцию, которая также действует как объект или объект, который также может выполнять те же функции, что и функция, то функция уже делает это. Вы можете делать такие вещи, как:
var func = function() { return 'hello world'; }; // func is a function
func.property1 = 'foo'; // func is also an object
func.property2 = 'bar';
Лучшим решением вашего вопроса может быть использование того факта, что функции фактически являются объектами с добавленными функциональными способностями.