面向对象:重视一件事的参与对象,是一种高级的编程思维
定义对象
var obj = {} 字面量方法
var obj = new Object() 构造函数方式
工厂函数
工厂函数:批量生产对象的
var obj = {
name:'张三',
age:12
}
var pbj = {
name:'李四',
age:14
}
console.log(obj)
console.log(pbj)
同类型对象的重复定义,这时要用工厂函数解决
function fn(){
var obj = {
name:name,
age:age
}
return obj
}
var a = fn('张三',12) //人
var b = fn('李四',14) //人
var c = fn('大黄',2) //狗
console.log(a) //Object
console.log(b) //Object
console.log(c) //Object
工厂函数的缺点:所有的数据一模一样,无法从数据类型中区分逻辑层面的类型,分不清那个是人,那个是狗。
使用构造函数解决工厂函数的缺点
构造函数:new出来的数据,可以一目了然的看到是什么逻辑层面的数据
需要使用自己定义的函数做构造函数来解决问题
function Person(){
}
var p = new Person()
function Dog(){
}
var d = new Dog()
p.name = '张三'
p.age = 12
d.name = '大黄'
d.age = 2
console.log(p,d) //Person Dog
构造函数>工厂函数
构造函数
构造函数:有系统提供的:Object Array RegExp Date Number String ....,只要是new 跟的函数就可以
叫做构造函数
构造义对象添加属性
自己定义的构造函数,给new出来的对象添加属性:
function fn(){
this.属性 = 值
}
例:
function Person(){
//1.创建一个空对象 隐形的
var obj = {}
//2.将空对象赋值给this 隐形的
//this = obj
//3.执行构造函数中的代码
//构造函数中的this是new出来的那个对象
this.name = '张三 //给this对象添加属性
//4.返回空对象 隐形的
//return obj
}
var p = new Person() //虽然在new,但也是在调用函数
//新的函数调用方式,通过new来调用
console.log(p)
构造函数传参
构造函数传参:通过new的时候调用函数传参
function Person(name,age,eat)
this.name = name
this.age = age
this.eat = eat
}
//箭头函数中的this,在定义的时候就已经知道了代表什么
var p1= new Person('张三','12',() => {
console.log(this.name + '吃饭了')
)}
var p2 new Person('李四','14,() => {
console.log(this.name + '吃饭了')
)}
var p1=new Person('张三',12,function(){
console.log(this.name + '吃饭了')
})var p2= new Person('李四',14,function(){
console.log(this.name + '吃饭了')
})
console.log(p)
义对象的方式:使用自定义构造函数
添加属性:通过new的时候调用函数传参
p.eat()
console.log( p1.eat === p2.eat ); // false
//一模一样的函数,没有必要占用两个内存空间了
var eat = '呵呵哈哈哈'
function Person(name,age,eat){
this.name = name
this.age = age
this.eat = eat
}
function eat(){
console.log(this.name + '吃饭了')
}
//定义在全局中的变量容易被覆盖
var p1 = new Person('张三',12,eat)
var p2 = new Person('李四',14,eat)
console.log(p1,p2)
console.log(p1.eat === p2.eat) //true