2020-07-13

面向对象知识总结


什么是对象?

对象就是可以拥有属性和方法的一个集合,是无序的键值对,并且对象的属性和方法可以改变。

创建对象的方法。

.方法和[]方法。

点方法后面跟的必须是一个指定的属性名称,而中括号方法里面可以是变量。

中括号方法里面的属性名可以是数字,而点方法后面的属性名不可以是数字。

当动态为对象添加属性时,必须使用中括号[],不可用点方法。

工厂函数创建对象:通过函数批量创建结构相同的对象,叫做工厂函数。

优点:可以同时创建多个对象

缺点:创建出来的没有具体的类型(比如是Array和MouseEvent),都是object类型的,但我们看到自己的对象只是object,不知道具体是什么类型。

解决方案:自定义构造函数。其实相当于自己写一个函数,专门用来new对象。

自定义构造函数

自定义构造函数就是根据固定的模板,创建一个新对象,创建的对象有构造函数的属性和方法。

this指向了这个新对象(新对象就有了属性,创建了属性)

执行构造函数,也就是调用了这个函数(给对象添加属性和方法,给属性和方法赋值)

返回这个新对象

构造函数的作用:

给对象添加属性和方法


构造函数和普通函数不同的地方在于使用new的时候,中间发生了很多看不见的过程:

创建了一个新对象

this指向了这个新对象(新对象就有了属性,创建了属性)

执行构造函数,也就是调用了这个函数(给对象添加属性和方法,给属性和方法赋值)

返回这个新对象

构造函数的作用:

给对象添加属性和方法,这个过程称之为--实例化。

function Person(name,age){

    this.name=name;

    this.age=age;

    this.eat=function (){

    consolo.log("吃")

    }

    }

var per=new Person("li" ,18)

per.eat()

上面的eat()是一个方法,如果多次创建对象,那么创建的对象中的eat方法不是同一个,所以就会占用大量内存空间,

所以要使用原型。

面向对象

面向对象不是一种语法,是一种编程的思想。

特征分别为:封装,继承;

1:封装

我们平时所用的方法和类都是一种封装,当我们在项目开发中,遇到一段功能的代码在好多地方重复使用的时候,我们可以把他单独封装成一个功能的方法,这样在我们需要使用的地方直接调用就可以了。

2.继承:在不改变源程序的基础上进行扩充,原功能得以保存,并且对子程序进行扩展,避免重复代码编写。

原型

任何一个对象,天生自带一个属性:__proto__ , 这个东西是一个对象,原型/原型对象,对象的上一级为原型。

对象可以访问到原型上的属性和方法。

任何函数天生自带一个属性:prototype,这个东西是一个对象,原型/原型对象。

任何原型对象天生自带一个属性:constructor,这个东西是一个函数,是构造函数。

原型的作用之一就是 —> 数据共享,节省内存空间

原型链

任何对象天生自带属性 __proto__ ,这个东西是一个对象,原型/原型对象

原型对象是对象,既然是对象就有 __proto__ 这个属性 ,原型的原型 ....

这样形成的一条链式结构,叫做原型链。

作用

一个对象在访问一个属性的时候,首先看自己有没有,有就能访问,没有找他的原型要,原型有就用,没有,就找原型的原型要,一直往上找,找到就能用,一直到了null也没有找到,返回undefined。


当对象在调用一个方法时,首先看自己有没有,有就能调用,没有找他的原型要,原型有就能调用,没有,就找原型的原型要,一直往上找,找到就能调用,一直到了null也没有找到,调用会报错   ... is not a function。

 function Cat(name, age) {

            this.name = name; //this.后面的变量可以随意取名

            this._age = age //潜规则:下滑线开头的属性为私有属性,不能直接调用,需要方法调用

            //但浏览器是没有办法,限制直接调用的,需要靠自觉

        }

        Cat.prototype.jiao = function () {//构造函数的方法 每个函数都有一个prototype属性,其值是一个对象

            console.log(this.name + '喵~~~~喵~~~喵~~~~')//在prototype上的属性和方法,会被这个函数new的对象所共享

        }

        let c1 = new Cat('小喵', '18');//调用构造函数的时候,要用new操作符来创建对象

        console.log(c1)

        //new的时候浏览器做了哪些事情

        //1.创建了一个对象

        //2.对象有一个属性__proto__ 其值为prototype

        //3.构造函数里的this指向这个new创建的对象

        //4.执行构造函数

        //5.返回这个对象

        c1.jiao();//访问一个对象的属性和方法,先在对象本身上查找

        //如果找到,则返回,如果找不到的话,就在对象的__proto__上面进行查找

        //一直到__proto__的值为null

        //所有对象的父级为Object

        //所以,如果在Object的prototype上创建方法,那么这个方法会由所有的对象共享

        Object.prototype.ha = function () {

            console.log('我是Object下的ha方法');

        }

        c1.ha();

    //如果有两个同名的方法,会在自下而上的查找过程中,先发现那个,就调用那个






你可能感兴趣的:(2020-07-13)