面向对象编程
js创建对象的方法
1、直接创建 (new object())
优点 :方便快捷 可以快速创建
缺点:不能量产 每次都需要重新书写代码
var students=[]
var s1={
name:"王一",
height:180,
age:21,
eat:function(){
console.log(this.name+"正在吃饭")
},
run:function(){
console.log(this.name+"正在跑")
}
}
var s2={
name:"王一",
height:180,
age:21,
eat:function(){
console.log(this.name+"正在吃饭")
},
run:function(){
console.log(this.name+"正在跑")
}
}
var s3......
2、工厂模式 (function)
优点 :可以快速量产
缺点:没有办法检测创建出来的对象的对应类型
var students=[]
function createStudent(name,age,height){
var obj=new Object()
obj.name=name
obj.height=height
obj.age=age
obj.eat=function(){
console.log(this.name+'正在吃')
}
return obj
}
//string Array number
var s1=createStudent("王一",21,180)
var s2=createStudent("王二",22,192)
var s3........
instanceof 用于检测对应数据的类型
如 a instanceof object 返回 true or false
!!!在简单的数据类型(Boolean 数值 字符串 )中必须通过new来创建的 才可以检测 否则不可以
3、构造函数创建对象 (模拟类的方法)(首字母通常大写)
优点 :可以量产 解决了工厂模式的 问题 可以判断对象类型 (instanceof)
缺点 :存储消耗(同样的方法,会开辟不同的存储空间,造成内存的大量消耗)
function Student(name,age,height){
this.name=name
this.age=age
this.height=height
this.eat=function(){
console.log(this.name+'正在吃')
}
}
var s1=new Student("王一",21,180)
var s2=new Student("王二",55,58)
this指向问题
原则是 谁调用 指向谁
1、普通函数中的this 指向window
2、对象方法中的this 指向对象
3、构造函数创建对象的方法中的this 指向new出来的对象
4、定时器中的this 指向window
5、call apply 调用的this 指向新的值
过程中new的做用:
1. 创建一个空对象 {}
2. 将构造函数中的this指向 空对象
3. 将构造函数中所有属性 和方法 都赋值给{}
4. 将对象返回
4、原型模式创建对象
优点:解决了构造函数创建对象的缺点 把共有的方法放到原型中 节约内存
unction Student(name,age,height){
this.name=name
this.age=age
this.height=height
}
//将共有的方法写到 构造函数的原型中
//prototype 构造函数的原型
//__proto__ 实例化对象的原型
Student.prototype.eat=function(){
console.log(this.name+"正在吃")
}
var s1=new Student("王一",21,180)
var s2=new Student("王二",22,222)
s1.__proto__.run=function(){
console.log(this.name+"正在跑")
}
原型和原型链
1、同一个new创建出来的对象的原型(_proto_)相同 指向共同的对象 -----原型对象(prototype)
2、new创建出来的对象都有_proto_属性 指向这个函数的原型对象
3、所有原型对象的_proto_属性默认指向 Object
4、Object的_proto_属性指向null
5、各个函数原型对象中又有一个 constructor 指向函数对象
6、所有函数对象的_proto_指向Function原型对象
7、Function原型对象的_proto_指向Object原型对象