首先定义一个tsconfig.json
{"include": ["./src/**/*"],"exclude": ["node-modules"],"compilerOptions": {"target": "ES6","module": "ES6","strict": true,"outDir": "./dist"}}
class Dog{name = '旺财';age = 3;bark(){alert('汪汪汪');}}const dog = new Dog();console.log(dog);//打印dog
用html
但是我们一个类不可能只见一个一个对象,如果只创建一个对象意义不大了,所以一般我们都是创建多个对象
创建多个对象:
const dog = new Dog();const dog2 = new Dog();const dog3 = new Dog();const dog4 = new Dog();console.log(dog);//打印dogconsole.log(dog2);console.log(dog3);console.log(dog4);
得到了四个旺财
这个类实际上我们创建的时候有问题:我们希望这个类是用来创建狗的,不同的狗的。现在的确创建出了四个对象但是四个对象里它们的属性都是一模一样的,这就意义不大了
不是说直接给这个属性直接去指定值:
class Dog{name:string;age:number;bark(){alert('汪汪汪');}}
那怎么办?
首先俩个问题:
- 1.这个
name和age的值我们不能在类里面进行指定,因为在类里面去指定就意味着所有的对象都是这个值 - 2.我还不能不给值,不给值就意味着我们这里就没有这个属性了
那问题是:我什么时候给它值?
首先说这个值在定义这个类的时候,这个值是不能确定的;不能不给,什么时候给?创建对象的时候给
这里面就要用到这么一个函数:
constructor()
constructor被称为**构造函数**;构造函数会在**对象创建时调用**
class Dog{constructor(){console.log('构造函数执行了')}}new Dog()
你每次new Dog()你的构造函数都会执行,调new Dog()实际上就是等于调用这个类里面的构造函数
this
this就是表示**当前对象**
在方法中可以通过this来表示当前调用方法的对象
class Dog{constructor(){//在实例方法中,this就表示当前的实例//在构造函数中当前对象就是当前新建的那个对象//可以通过this向新建的对象中添加属性console.log(this)}}new Dog()
在实例方法中,this就是表示当前的实例
class Dog{constructor(){//在实例方法中,this就表示当前的实例//在构造函数中当前对象就是当前新建的那个对象//可以通过this向新建的对象中添加属性console.log(this)this.name = '旺财';this.age = 3;}}new Dog()
跟之前写的其实是一样的,得这么写:
class Dog{// name:string;// age:number;//constructor被称为构造函数//构造函数会在对象创建时调用constructor(name:string,age:number){this.name = name;this.age = age;}bark(){alert('汪汪汪');}}
那我调用的时候就不能new Dog()这么调了(你构造函数里面需要几个参数,你就得传几个参数进去):
class Dog{//constructor被称为构造函数//构造函数会在对象创建时调用constructor(name:string,age:number){this.name = name;this.age = age;}bark(){alert('汪汪汪');}}const dog = new Dog('旺财',4);const dog2 = new Dog('小贝',5);console.log(dog);//打印dogconsole.log(dog2);
这个时候你就会发现:
Dog {name: '旺财', age: 4}Dog {name: '小贝', age: 5}
这时我就创建出了name和age都不相同的对象,这样我们的Dog类才变得真的有意义
构造函数里的this的name和age报红波浪是因为你name和age没有定义,所以name和age属性都给它写上
class Dog{name:string;age:number;//constructor被称为构造函数//构造函数会在对象创建时调用constructor(name:string,age:number){this.name = name;this.age = age;}bark(){alert('汪汪汪');}}const dog = new Dog('旺财',4);const dog2 = new Dog('小贝',5);console.log(dog);//打印dogconsole.log(dog2);
构造函数和属性是怎么分工的
属性
- 1.属性实在我们类中直接定义的,写几个就有几个
- 2.在赋值的时候是在构造函数里面赋值的,根据你的参数
