面向对象

58 阅读2分钟
面向对象:重视一件事的参与对象,是一种高级的编程思维
定义对象
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