public.onChange = Function.prototype做什么?

时间:2018-03-14 20:55:01

标签: javascript angular typescript angular5

当我试图找到一些示例代码来设计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原型分配一些函数。这是一个好的做法,作者试图用它做什么?

2 个答案:

答案 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

这允许程序员可选地注册事件处理程序。