面向对象

Posted solaris-wwf

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了面向对象相关的知识,希望对你有一定的参考价值。

面向对象
    1.继承
        1.继承和UML图
            1.类的继承
技术图片
                1.父类和子类
                    例如动物类是父类,则狗就是子类,父类又可以称为基类。子类是无法继承的。
                2.方法重写
                    父类的方法有时候不适用于子类,所有原生js的对象都继承于object,比如将数组toString,并用逗号隔开,相当于子类将父类的方法重写了
            2.UML表示类
                父类Animal,子类dog,子类cat
            3.UML表示继承
                子类dog继承父类,子类cat继承父类
        2.构造函数继承
            Person构造函数一般用大写字母开头,提示创建者需要new来新建一个对象
                function Person (name,age)
                    this.name = name;
                    this.age = age;
                    this.sayHello = function()
                        alert(this.name);
                    
                

 

            我们一般不把方法放到基类上,而是把方法放到原型上
                function Person (name,age)
                    this.name = name;
                    this.age = age;
                
                Person.prototype.sayHello = function()
                    alert(this.name);
                

 

            1.创建了一个Person对象
            2.将this指针指向了这个对象
            3.执行构造函数代码
            4.将构造函数返回
                 var p = new Person(); 
                apply call
            一个函数通过普通的方法去调用Person();this指针指向根元素window,如果通过某个对象的方法去调用,这个this指针指向这个方法前面的对象.
                function Student (name,age,id)
                    Person.apply(this,[name,age]);//this指针就不会指向window,而是指向Student.
                    Person.call(this,name,age);//也可以使用call,call是将参数独立传入,而apply则使用数组的方式。
                    this.id = id;
                    this.sayHello = Person.aplly.sayHello()
                    this.study = function()
                        alert(this.id + "is studying");
                    
                

 

        3.原型链继承
            1.原型prototype
            2.基于原型的继承
                1.Object.create();
                2.原型继承图示。
技术图片
                3.原型链
                    只要创建了函数,prototype就会自动生成在函数内。prototype指向一个对象,这个对象就是Person prototype
                    name age sayHello都创建在Person prototype对象上。
                    Person                   Person prototype   <--------------- p
                    prototype--------》      name                                _proto_
                                                     age
                                                     sayHello()

 

                    1.创建了一个Person对象
                    2.创建了一个属性,双向线_proto_,它指向了构造函数的原型
                    3.将this指针指向了这个对象
                    4.执行构造函数代码
                    5.将构造函数返回
                        function Person()
                        Person.prototype.name = "sdf";
                        Person.prototype.age = 11;
                        Person.prototype.sayHello = function ()
                            alert(this.name);
                        
                        var p = new Person();
                        p.sayHello();

 

                    当访问一个对象属性的时候,首先在对象本身上进行查找,如果找到这个属性,则返回,停止查找,如果没有找到,则到原型上找,双向线__proto__上查找。
                        function Student()
                    创建一个中间对象__proto__,Studentprototype指向了中间对象__proto__,中间对象__proto__指向Person prototype,改变中间对象的值不会对Person prototype有所影响。
                         Student.prototype = Object.create(Person.prototype); 
                    创建的s对象的双向线__proto__指向了原型指向的对象中间对象__proto__
                        var s = new Student;
                        s.sayHello();

 

                    假使我们访问一个方法,s.study();双向线__proto__会一层一层去找指向的对象,有则返回,没有则查到NULL值为止返回。这种查找方式是比较慢的,它需要一层层的去找,不如变量快,因为变量是直接在地址上查找。
        4.混合继承
            1.构造函数+原型链
                构造函数没办法继承原型上的属性和方法的,如果是纯的原型的继承,没有参数的传递,相当于我们创建的对象都是一模一样的,将两个方法混合起来,就叫做混合继承,也叫组成继承。
            2.属性的继承
            3.方法的继承
                我们一般把属性放在对象上,把方法放到原型上。这样子类不会被属性所改变,也保证了,函数的方法可以被所有的proto共享。
                function Person (name,age)
                    this.name = name;
                    this.age = age;
                
                Person.prototype.sayHello = function()
                    alert(this.name);
                
                function Student (name,age,id)
                    Person.apply(this,[name,age]);//this指针就不会指向window,而是指向Student.
                    Person.call(this,name,age);//也可以使用call,call是将参数独立传入,而apply则使用数组的方式。
                    this.id = id;
                
                Student.prototype = object.create(Person.prototype);
                Student.prototype.study = function()
                        alert(this.id + "is studying");

 

    2.闭包
        1.什么是闭包
        2.闭包的原理
        3.闭包的应用

以上是关于面向对象的主要内容,如果未能解决你的问题,请参考以下文章

224 面向对象编程介绍,面向过程与面向对象

面向对象-面向对象和面向过程的区别

面向对象分析与设计面向对象设计包括哪些内容

面向对象

面向过程面向对象及面向对象的三大特征

Python面向对象学习 1 (什么是面向对象,面向对象的应用场景)