#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) { ... }