面向对象知识总结
什么是对象?
对象就是可以拥有属性和方法的一个集合,是无序的键值对,并且对象的属性和方法可以改变。
创建对象的方法。
.方法和[]方法。
点方法后面跟的必须是一个指定的属性名称,而中括号方法里面可以是变量。
中括号方法里面的属性名可以是数字,而点方法后面的属性名不可以是数字。
当动态为对象添加属性时,必须使用中括号[],不可用点方法。
工厂函数创建对象:通过函数批量创建结构相同的对象,叫做工厂函数。
优点:可以同时创建多个对象
缺点:创建出来的没有具体的类型(比如是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();
//如果有两个同名的方法,会在自下而上的查找过程中,先发现那个,就调用那个