在上篇文章《 JS constructor探讨(一):为什么要设置prototype.constructor?》中,我们发现prototype.constructor仅仅可以用于识别对象是由哪个构造函数初始化的,但在实践中,我们还有可能用到这个功能,并且还非常有用,比如Angular的控制器注册过程中,如果要为所有的Controller添加实例方法,并且要保持良好的封装性,还是比较困难的,如下:
app.controller('AppCtrl', function($scope) {
this.username = 'yiifaa';
// 直接添加,必然会导致更多的内存空间
this.getUsername = function() {
return this.username;
}
});
如果直接在this上添加方法,显然每个Controller实例都会拥有独立的方法,从而浪费了大量的内存空间,并且也不符合javascript对象的设计原则。
这样的应用场景还有很多,那如何在不把方法拆出来的情况下,添加原型方法呢?这时不妨利用prototype.constructor属性,如下:
app.controller('AppCtrl', function($scope) {
this.username = 'yiifaa';
// 通过constructor属性直接指向构造函数
this.constructor.prototype.getUsername = function() {
return this.username;
}
});
结论
我们利用constructor可以直接指向构造函数,从而不仅可以添加原型方法,还可以添加静态方法。