当我试图找到一些示例代码来设计Angular 5中的内联编辑表单输入组件时,我正在摸不着头脑。我跑了以下几行:
public onChange: any = Function.prototype;
public onTouched: any = Function.prototype;
我的问题是:他们做了什么?然后该示例继续并实现ControlValueAccessor
接口。它会实现这样的一些成员:
public registerOnChange(fn: (_: any) => {}): void {
this.onChange = fn;
}
public registerOnTouched(fn: () => {}): void {
this.onTouched = fn;
}
所以看起来你会为全局Function原型分配一些函数。这是一个好的做法,作者试图用它做什么?
答案 0 :(得分:1)
可以安全地假设这些方法被用作钩子,并且无条件地使它们成为函数,这是开发人员在调用它们之前避免if (typeof onChange === 'function')
检查的一种方式。
Function.prototype
是所有常规函数的原型,基本上是noop函数。意外修改其属性(不太可能但可能)将影响所有现有功能,例如onChange.apply = ...
。
更安全,传统和可读的方法是明确分配noop值:
public onChange: any = () => {};
答案 1 :(得分:1)
在
public onChange: any = Function.prototype;
将Function.prototype的引用分配给public onChange成员变量,该变量是一个可调用的函数。在这种情况下,一个函数在初始化时什么都不做。
这样,你总是可以在没有崩溃的情况下调用onChange函数。
registerOnChange函数将覆盖此引用,而不是向全局原型添加函数。为此,代码看起来像
this.onChange['thisIsAGlobalFunction'] = fn;
// Square brackets and not dot-notation because of type-checking
这允许程序员可选地注册事件处理程序。