1.值类型和引用类型
在js中,number,string,boolean,都是值类型,值类型的变量,直接将数据保存到内存的栈空间中。
值类型的变量,在传递时,传的是副本。
在js中,对象,数组,都是引用类型,引用类型的变量,将数据保存在堆中,然后将堆的地址保存到栈中。
2.原型对象
prototype属性是类的原型对象
通常情况下,我们习惯将类的方法,定义到类的原型对象中,这样做的好处是,提高代码的利用率,不会开辟多余的内存空间。
__proto__属性是对象的原型对象,注意:同种类型多个对象上的原型对象 共同指向 类型上的原型对象。
类的原型对象上面的方法,类的对象,可以直接调用
3.ES6中定义类的新语法
// 定义一个Person类型classPerson{// 构造函数constructor(name,age,gender){this.name=name,this.age=agethis.gender=gender}// 给类添加一个方法sayHi=function(){console.log(this.name,this.age,this.gender);}//用这种方式定义的方法,是将方法定义的类的原型对象中去sayHello(){console.log('hello!');}}
4.继承
ES5:
// 定义一个人类functionPerson(name,age,gender){this.name=namethis.age=agethis.gender=gender}Person.prototype.eat=function(){console.log(`我叫${this.name},我在吃饭...`);}Person.prototype.say=function(){console.log(`大家好!我叫${this.name} 今年${this.age}岁 性别是${this.gender}`);}// 通过Person类型,创建出了两个对象letp1=newPerson('刘德龙',20,'男')p1.say()p1.eat()letp2=newPerson('高德政',21,'男')p1.say()p1.eat()console.log('-------------------------------------');//定义了学生类functionStudent(name,age,gender,no){// 继承Person类的属性Person.call(this,name,age,gender)// Student类特有的属性this.no=no}// 给Student类的prototype属性 new一个Person类型的对象// 用于继承Person类的方法Student.prototype=newPerson()Student.prototype.study=function(){console.log(`我叫${this.name},我的学号是${this.no},我在学习...`);}lets1=newStudent('张三',20,'女','1001')s1.study()s1.eat()s1.say()
ES6:
// 定义人类classPerson{// 定义构造函数constructor(name,age,gender){this.name=namethis.age=agethis.gender=gender}// 说话方法say(){console.log(`大家好!我叫${this.name} 今年${this.age}岁 性别是${this.gender}`);}// 吃方法eat(){console.log(`我叫${this.name},我在吃饭...`);}}// 每个类型都一个prototype属性,我们称它为类的原型对象。// 类的原型对象上面的成员,给类的所有实例(实例就是类创建出来的对象)共享。console.log(Person.prototype);// 通过Person类型,创建出了两个对象letp1=newPerson('刘德龙',20,'男')console.log(p1);p1.say()p1.eat()letp2=newPerson('高德政',21,'男')console.log(p2);p1.say()p1.eat()console.log('-------------------------------------');// extends关键字,表示继承classStudentextendsPerson{// 构造函数constructor(name,age,gender,no){// 调用父类的构造函数super(name,age,gender)// 学生特有的属性this.no=no}//学生学习的方法study(){console.log(`我叫${this.name},我的学号是${this.no},我在学习...`);}}lets1=newStudent('张三',20,'女','1001')console.log(s1);s1.study()s1.eat()s1.say()