高级js总结1

面向对象编程
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原型对象

Guess you like

Origin blog.csdn.net/m0_60324420/article/details/121716813