Javascript 向function.prototype动态添加函数
我是nodejs的新手。 我正在编写一个帮助函数来使用模式构建JSON,我正在尝试添加函数(主要是setter)来设置值。下面是它的一个简单版本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'
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]