Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/406.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 是否可以编写适用于每个名称的函数?_Javascript_Prototype - Fatal编程技术网

Javascript 是否可以编写适用于每个名称的函数?

Javascript 是否可以编写适用于每个名称的函数?,javascript,prototype,Javascript,Prototype,是否有可能为一个对象提供一个函数,该对象在调用函数时总是被调用,而不管其名称如何 或者换句话说:是否有可能有一个适用于所有可能名称的函数 可能需要对对象的原型进行一些更改 下面是一个如何工作的示例: const o = { [magic here]: () => 1; }; o.foo(); // returns 1 o.bar(); // returns 1 o.baz(); // returns 1 编辑以澄清我为什么要这样做: 我正在试验一种铁路规划方法。 基本上,我不希望

是否有可能为一个对象提供一个函数,该对象在调用函数时总是被调用,而不管其名称如何

或者换句话说:是否有可能有一个适用于所有可能名称的函数

可能需要对对象的
原型进行一些更改

下面是一个如何工作的示例:

const o = {
  [magic here]: () => 1;
};

o.foo(); // returns 1
o.bar(); // returns 1
o.baz(); // returns 1

编辑以澄清我为什么要这样做: 我正在试验一种铁路规划方法。 基本上,我不希望手动检查对象是否为
null
未定义
并做出相应的反应,而是希望这是自动化的

例如:


// checks if object is null and returns a object, that can be called however without crashing
// thanks to T.J. Crowder's answer
function saveNull(o){
  if(o !== null) return o;

  const p = new Proxy({}, {
    get(target, prop, receiver) {
      return () => p;
    },
  });

  return p;
}

const a = " abc"; // could be null

const b = a.toUpperCase().trim(); // could crash
const c = a ? a.toUpperCase.trim() : null; // approach 1
const d = a && a.toUpperCase().trim(); // approach 2
const e = saveNull(a).toUpperCase().trim(); // approach 3

我发现最后一种方法更具可读性和趣味性。

您可以在ES2015及更高版本中使用a来实现这一点;在ES5及以下版本中,您无法执行此操作

如果您真的希望每个可能的属性都返回这个神奇的函数,那么它相当简单:

constobj={};
常数魔法=()=>1;
常数p=新代理(obj{
获取(目标、道具、接受者){
回归魔法;
}
});
console.log(p.foo());//返回1
console.log(p.bar());//返回1

console.log(p.baz());//返回1
您为什么要这样做?我对此表示怀疑…..听起来您需要一个代理,但听起来您可能需要告诉我们@Kristoftd我添加了一个解释,说明我为什么要这样做。@Medtleukiliuly-不处理任何可能的随机属性名称。这在ES5中是不可能的,所以它不能是多填充的。