Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/462.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.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 向function.prototype动态添加函数_Javascript_Node.js - Fatal编程技术网

Javascript 向function.prototype动态添加函数

Javascript 向function.prototype动态添加函数,javascript,node.js,Javascript,Node.js,我是nodejs的新手。 我正在编写一个帮助函数来使用模式构建JSON,我正在尝试添加函数(主要是setter)来设置值。下面是它的一个简单版本 function Task() { this.action = {}; this.schedule = {}; } function capitalize(str) { return `${str[0].toUpperCase()}${str.slice(1)}`; } const scheduleProps = [ 'startAt'

我是nodejs的新手。 我正在编写一个帮助函数来使用模式构建JSON,我正在尝试添加函数(主要是setter)来设置值。下面是它的一个简单版本

function Task() {
  this.action = {};
  this.schedule = {};
}

function capitalize(str) {
  return `${str[0].toUpperCase()}${str.slice(1)}`;
}

const scheduleProps = [
'startAt',
'repeatEvery',
'endAt',
'count',
'interval'
];
动态地向其中添加方法

for(var i=0; i<scheduleProps.length; i++) {
  Object.defineProperty(Task.prototype, `set${capitalize(scheduleProps[i])}`, {
    enumerable: true,
    configurable: false,
    writable: true,
    value: (value) => {
      this.schedule[scheduleProps[i]] = value;
    }
  });
}
相反,我得到了

TypeError: Cannot set property 'repeatEvery' of undefined
我甚至试着这样设置函数

  Task.prototype[`set${capitalize(scheduleProps[i])}`] = (val) => {
    this.schedule[scheduleProps[i]] = val;
  }
在这种情况下,我得到

TypeError: Cannot set property 'interval' of undefined
at Task.(anonymous function) [as setRepeatEvery]
如何动态地将方法设置为function.prototype?
非常感谢您的帮助

您面临的问题主要是因为为“value”键指定了函数

您可以在那里找到一些更改,这些更改创建了一个闭包,并且还更改了在对象键处分配函数的语法

创建闭包是为了维护该特定迭代的i值

函数任务(){
this.action={};
本表={};
}
函数大写(str){
返回`${str[0].toUpperCase()}${str.slice(1)}`;
}
const scheduleProps=[
“开始”,
“重复每一次”,
“endAt”,
“伯爵”,
“间隔”
];

for(var i=0;i循环运行在哪里?λ(箭头)如果循环没有在成员方法中运行,函数将不会有正确的
this
作用域。尝试使用常规的
函数
Awesome Balázs!!我必须将其移动到构造函数中,它才起作用。我需要将它们作为lambda函数,以便将函数设置为主函数原型JSON是一种数据交换格式,像XML或YAML。我在您的示例中没有看到任何JSON。JavaScript对象不是JSON。我的另一个问题是哪种方法更好?是通过
Object.defineProperty()定义,而不是
Task.prototype[methodName]
?您想完成什么?在您向原型中添加这些动态内容后,您能展示一下您希望原型是什么样子吗?然后,您希望如何访问这些内容。对于初学者,您的
For
循环已经运行到完成,因此在调用value方法时,
i
变量是错误的。感谢Jitendra,我必须将for循环移动到Task()构造函数中。通过添加匿名函数,这是匿名函数的作用域。我希望将这些方法添加到Task.prototypeBy上面的代码这些函数已经在Task类的原型上。您可以在浏览器控制台中运行此代码,然后在类型“Task.prototype”之后运行这将向您展示所有这些。答案应该解释OP出现问题的原因以及如何解决它。@RobG谢谢。添加了相同的解释。非常感谢Jitendra。正如您提到的,当函数实际执行时,我缺少数组作用域。太棒了!
TypeError: Cannot set property 'interval' of undefined
at Task.(anonymous function) [as setRepeatEvery]