在angular 2 decorator中可以访问私有成员
private members are accessible in angular 2 decorators
考虑以下代码:
export class Hero {
constructor(private id: number, private name: string) {}
}
@Component({
selector: 'my-app',
template: '<h1>{{title}}</h1><h2>{{hero.name}} details!</h2>'
})
export class AppComponent {
private title = "Tour of Heroes";
private hero: Hero = new Hero(1, "Windstorm");
}
然而,在AppComponent
的模板中,我编写了hero.name
,根据Hero
类,这个字段是私有的,不应该是可访问的。这段代码是如何编译和工作的?我是不是错过了什么?
编辑:阅读为什么会发生这种情况的答案,这是我的处理方法,这不是一个修复方法,但它可以使事情更有组织性和安全,此外访问者总是很好使用:
export class Hero {
constructor(private _id: number, private _name: string) { }
get name(): string {
return this._name;
}
get id(): number {
return this._id;
}
}
@Component({
selector: 'my-app',
template: '<h1>{{title}}</h1><h2>{{hero.name}} details!</h2>'
})
export class AppComponent {
private title = "Tour of Heroes";
private hero: Hero = new Hero(1, "Windstorm");
}
当hero.name
将在JS中执行时,它应该调用您在TS代码中定义的JS编译的getter函数,这应该在保持TS代码样式的同时对属性进行某种控制。
在JavaScript中没有私有变量这回事。像private
这样的关键字只是由TypeScript转译器用于在转译之前强制执行约束。一旦代码被转换成JavasScript,name
属性就是Hero类的可见成员。
typescript中的private
关键字仅用于编译时检查,在运行时实际上并不限制对任何内容的访问。typescript编译器没有检查你的模板,所以它没有发现问题。
我相信一些IDE(VS Code和WebStorm)正在对您的模板进行类型检查,但目前您正在使用自己的
Angular2声明在模板中引用私有变量是正确的方式。请参阅备忘单:https://angular.io/docs/ts/latest/cookbook/component-communication.html##父到子setter。
所以继续吧!并启用对组件的封装,而不是将每个变量公开为公共变量。
相关文章:
- 如何访问对象's成员通过另一种方法填充的方法
- PhantomJS无法访问已删除QObject的成员“评估”
- 为什么可以在内部函数成员中访问对象引用,而不能在内部属性成员中访问
- 从JavaScript对象访问数据's数组成员变量
- 访问jQuery中类的第二个成员
- 为什么在访问一个新对象的成员之前将其括在括号中
- Javascript通过引用访问成员变量
- 访问原型函数中的私有成员
- 访问javascript中对象类型的数组成员
- 在对象内部使用 for-in 循环来访问其成员
- 为什么$scope成员被访问三次
- 如何从回调访问成员变量
- 数组填充外部函数 - 不可访问的成员
- 如何同步对 JavaScript 对象的私有成员的访问
- 如何访问实例上的静态成员
- 如何访问成员模板中的数组位置
- Javascript 全局数组访问成员未定义
- 从异步调用访问成员方法
- 通过hasMany关系访问成员模型对象中的相关集合
- javascript从外部作用域变量访问成员函数