创建一个学生对象:
属性:姓名、年龄
方法:吃饭
1.直接创建法:
优点:创建简单
缺点:无法量产
var student={
name:'王一',
age:21,
eat:function(){
console.log(this.name+"正在吃")
}
}
缺点:无法量产——当我们需要创建多个学生对象的时候需要将这一段代码重写 如:
var s1={
name:'王二',
age:22,
eat:function(){
console.log(this.name+"正在吃")
}
}
var s2={
name:'王三',
age:23,
eat:function(){
console.log(this.name+"正在吃")
}
}
2.工厂模式——将创建对象的过程封装到函数内部 ,直接调用函数进行对象创建。通过函数来创建对象
优点:可以量产
缺点:无法明确对象的类型 ,全都是object类型的,无法进行类型的细分
function Student(name,age){
var s=new Object()
s.name=name
s.age=age
s.eat=function(){
console.log(this.name+'正在吃')
}
return s
}
var s1=Student("王一",21) //object
var s2=Student("王二",10)
通过参数的改变来创建不同的学生对象,该方法相较于直接创建法更加的便捷(可以量产),但也存在着一定的弊端,如:无法明确对象的类型 ,全都是object类型的,无法进行类型的细分
function Teach(name,age){
var t=new Object()
t.name=name
t.age=age
t.eat=function(){
console.log(this.name+'正在吃')
}
return t
}
var t1=Teach("张三",30)
console.log(t1 instanceof Teach)//返回false
注:instanceof 用于检测数据类型 返回布尔值 通常用于检测复杂数据类型 简单数据类型没法检测。instanceof 检测变量的数据类型 ,对应变量必须为原型创建出来的 。简单数据类型在直接创建时,不走原型。
3.构造函数——构造函数的方式来模拟类!!! 利用js中this指向性可以改变的问题来实现
优点:可以明确对应的对象类型
缺点:不同对象中的相同方法无法公用,需要独立存储,造成内存损耗
function Student(name,age){
this.name=name
this.age=age
this.eat=function(){
console.log(this.name+"正在吃")
}
}
function Teach(name,age){
this.name=name
this.age=age
this.eat=function(){
console.log(this.name+"正在吃")
}
}
var s1=new Student("王一",21)
var s2=new Student("王二",22)
var t1=new Teach("张三",24)
console.log(s1 instanceof Student)//返回true
console.log(t1 instanceof Teach)//返回true
注:通过同一个构造函数创建出来的对象原型是相等的
对象的原型__proto__
console.log(s1.__proto__==s2.__proto__)//返回true
缺点:s1中eat方法 s2也有eat方法 造成内存的消耗
console.log(s1.eat==s2.eat)//返回false
4.原型创建:将公有的方法 放到原型中
优点:解决了构造函数存在的方法无法公用的问题
//构造函数原型 ==实例化对象的原型
//将共有的方法放入构造函数的原型中
function Student(name,age){
this.name=name
this.age=age
}
Student.prototype.eat=function(){
console.log(this.name+'正在吃')
}
var s1=new Student("王一",21)
s1.eat()
var s2=new Student("王二",22)
s2.eat()
console.log(s1.eat==s2.eat)//返回true