Возможно ли расширить объект «в» функцию?

#javascript

#javascript

Вопрос:

Мне всегда казалось интересным, что в JavaScript вы действительно можете расширять функции в объекты:

 var order = function(x, y) {
  return x < y ? [x, y] : [y, x];
};

order.backwards = function(x, y) {
  return order(x, y).reverse();
};
  

Я не буду утверждать, что есть много причин для выполнения вышеуказанного (но опять же, почему бы и нет?); мой вопрос просто в том, возможно ли сделать обратное. То есть, могу ли я иметь что-то вроде:

 var order = {
    backwards: function(x, y) {
        return order(x, y).reverse();
    }
};

// Obviously, this is not real; I'm just wondering if there's any way
// to accomplish the same thing.
addFunctionBehavior(order, function(x, y) {
    return x < y ? [x, y] : [y, x];
};
  

Комментарии:

1. «в JavaScript вы действительно можете расширять функции в объекты» : это потому, что функции являются объектами. Но вы не можете превратить объект в функцию afaik.

2. @FelixKling: Достаточно справедливо. Но это не отменяет мой вопрос, не так ли?

Ответ №1:

Вы не можете. Что вы можете сделать, так это взять объект и вернуть функцию.

Помните, что функции — это объекты, за исключением того, что они наследуются от Function.prototype вместо Object.prototype

У них также есть внутреннее [[Call]] свойство, которое вызывается при их вызове. вы не можете расширить объект и присвоить ему [[Call]] свойство.

Однако вы могли бы сделать что-то очень похожее, используя прокси ES6 (которые нестандартны и имеют посредственную поддержку браузера).

Ответ №2:

Если вы укажете имя для свойства, вы могли бы сделать:

 addFunctionBehavior(order, 'reverse', function(x, y) {
    return x < y ? [x, y] : [y, x];
};
  

учитывая:

 function addFunctionBehavior(o, name, fn) {
  o[name] = fn;
} 
  

Но я не знаю, почему я хотел бы сделать это вместо:

 order.reverse = function (x,y) { ... }