Javascript 在构造函数中声明和在构造函数外部声明之间的区别

Javascript 在构造函数中声明和在构造函数外部声明之间的区别,javascript,angular,ecmascript-6,Javascript,Angular,Ecmascript 6,我用的是ES6和Angular2。在构造函数中声明这样的内容有什么区别: class Example{ constructor(private one: SomeClass, two: SomeClass){ this.two = two; } } class Example2{ private three:String = `What's the difference?` } var someClass1 = new SomeClass(); va

我用的是ES6和Angular2。在构造函数中声明这样的内容有什么区别:

class Example{
    constructor(private one: SomeClass, two: SomeClass){
        this.two = two;
    } 
}
class Example2{
    private three:String = `What's the difference?`
}
var someClass1 = new SomeClass();
var someClass2 = new SomeClass();

var myExample = new Example(someClass1, someClass2);
var myExample2 = new Example2();
就像这样:

class Example{
    constructor(private one: SomeClass, two: SomeClass){
        this.two = two;
    } 
}
class Example2{
    private three:String = `What's the difference?`
}
var someClass1 = new SomeClass();
var someClass2 = new SomeClass();

var myExample = new Example(someClass1, someClass2);
var myExample2 = new Example2();

到目前为止,我理解如果我导入一个类,那么我必须通过构造函数声明它。这里的
one
two
two
之间有什么区别?

构造函数中的代码将在创建对象实例时执行。类中的代码,但构造函数外的代码成为类使用的类字段/成员,或在创建实例后可以调用的类字段/成员

在你的例子中
one
two
是在实例化类时应传递给构造函数的参数的名称。这些值必须传递给构造函数

另一方面,
three
是一个类“字段”。它由类创建,并在类的生存期内私自使用。它没有被传给班级

因此,举个例子来说:

class Example{
    constructor(private one: SomeClass, two: SomeClass){
        this.two = two;
    } 
}
您可以这样实例化它:

class Example{
    constructor(private one: SomeClass, two: SomeClass){
        this.two = two;
    } 
}
class Example2{
    private three:String = `What's the difference?`
}
var someClass1 = new SomeClass();
var someClass2 = new SomeClass();

var myExample = new Example(someClass1, someClass2);
var myExample2 = new Example2();
但在这种情况下:

class Example2{
    private three:String = `What's the difference?`
}
您只需实例化如下所示:

class Example{
    constructor(private one: SomeClass, two: SomeClass){
        this.two = two;
    } 
}
class Example2{
    private three:String = `What's the difference?`
}
var someClass1 = new SomeClass();
var someClass2 = new SomeClass();

var myExample = new Example(someClass1, someClass2);
var myExample2 = new Example2();

构造函数中的代码将在创建对象实例时执行。类中的代码,但构造函数外的代码成为类使用的类字段/成员,或在创建实例后可以调用的类字段/成员

在你的例子中
one
two
是在实例化类时应传递给构造函数的参数的名称。这些值必须传递给构造函数

另一方面,
three
是一个类“字段”。它由类创建,并在类的生存期内私自使用。它没有被传给班级

因此,举个例子来说:

class Example{
    constructor(private one: SomeClass, two: SomeClass){
        this.two = two;
    } 
}
您可以这样实例化它:

class Example{
    constructor(private one: SomeClass, two: SomeClass){
        this.two = two;
    } 
}
class Example2{
    private three:String = `What's the difference?`
}
var someClass1 = new SomeClass();
var someClass2 = new SomeClass();

var myExample = new Example(someClass1, someClass2);
var myExample2 = new Example2();
但在这种情况下:

class Example2{
    private three:String = `What's the difference?`
}
您只需实例化如下所示:

class Example{
    constructor(private one: SomeClass, two: SomeClass){
        this.two = two;
    } 
}
class Example2{
    private three:String = `What's the difference?`
}
var someClass1 = new SomeClass();
var someClass2 = new SomeClass();

var myExample = new Example(someClass1, someClass2);
var myExample2 = new Example2();
是的缩写语法

class Example{
    private one: SomeClass;
    constructor(one: SomeClass, two: SomeClass){
        this.one = one;
        this.two = two;
    } 
}
因此,如果在构造函数参数之前有
private
protected
public
,则会立即通过传递给构造函数的值声明和初始化类字段

是的缩写语法

class Example{
    private one: SomeClass;
    constructor(one: SomeClass, two: SomeClass){
        this.one = one;
        this.two = two;
    } 
}

因此,如果在构造函数参数之前有
private
protected
public
,则会立即通过传递给构造函数的值声明和初始化一个类字段。

one
会自动声明,因为它具有
private
修饰符<代码>两个不会被声明,因为它没有这样的修饰符。如果
this.two=two将导致错误,具体取决于编译器配置。
one
自动声明,因为它具有
private
修饰符<代码>两个
不会被声明,因为它没有这样的修饰符。如果
this.two=two将导致错误,具体取决于编译器配置。
myExample
是否与ES5中构造函数的工作方式相同?@userqwert是。你只需要在ES6和TypeScript中添加一些语法糖就可以了。
myExample
与ES5中构造函数的工作原理相同吗?@userqwert是的。您只需要在ES6和TypeScript中添加一些语法糖。