我正在学习Angular2
并在classes
第一次使用javascript
。
private
参数是什么以及它为什么不能简单heroService: HeroService
?
constructor(private heroService: HeroService) { }
答案 0 :(得分:8)
看起来像parameter property(大约在页面的一半)。基本上,向构造函数参数添加访问修饰符(public / private / protected / readonly)会自动将该参数分配给同名字段。
具体来说,来自那些文档:
通过为构造函数参数添加前缀来声明参数属性 使用辅助功能修改器或只读或两者。使用私人 参数属性声明并初始化私有成员; 同样,公共,受保护和只读也是如此。
以下是等同的:
class Foo {
private bar: string;
constructor(bar: string) {
this.bar = bar;
}
}
class Foo {
constructor(private bar: string) {}
}
答案 1 :(得分:0)
private将为此类(函数)设置此变量的范围。 如果你有这个类的实例,public将允许从外部访问。 protected对于抽象超类中的属性很重要。 当我开始使用Typescript时,TypeScript页面上的游乐场(https://www.typescriptlang.org/play/index.html)帮助我理解了真正发生的事情。请记住,TypeScript是您的JavaScript的糖
答案 2 :(得分:0)
了解私人 当成员标记为私有时,无法从其包含的类外部访问它。例如:
class Animal {
private name: string;
constructor(theName: string) { this.name = theName; }
}
new Animal("Cat").name; // Error: 'name' is private;
TypeScript是一种结构类型系统。当我们比较两种不同的类型时,无论它们来自哪里,如果所有成员的类型都兼容,那么我们说类型本身是兼容的。
但是,在比较具有私有成员和受保护成员的类型时,我们会以不同方式处理这些类型。对于两种类型兼容,如果其中一种具有私有成员,则另一种必须具有源自同一声明的私有成员。这同样适用于受保护的成员。
让我们看一个例子,以便更好地了解这在实践中如何发挥作用:
class Animal {
private name: string;
constructor(theName: string) { this.name = theName; }
}
class Rhino extends Animal {
constructor() { super("Rhino"); }
}
class Employee {
private name: string;
constructor(theName: string) { this.name = theName; }
}
let animal = new Animal("Goat");
let rhino = new Rhino();
let employee = new Employee("Bob");
animal = rhino;
animal = employee; // Error: 'Animal' and 'Employee' are not compatible
在此示例中,我们有一个Animal
和一个Rhino
,其中Rhin
o是Animal
的子类。我们还有一个新的类Employee
,在形状方面看起来与Animal
相同。我们创建这些类的一些实例,然后尝试将它们分配给彼此以查看将发生的情况。由于Animal
和Rhino
在private
中的private name: string
声明中共享Animal
形状的Employee
面,因此它们是兼容的。但是,Employee
不是这种情况。当我们尝试从Animal
分配到Employee
时,我们会收到这些类型不兼容的错误。尽管private
还有一个名为name
的{{1}}成员,但它不是我们在Animal
中声明的成员。
有关详情,请查看: