js面向对象
这篇总结主要讲解了js面向对象,编程思想+构造函数+原型对象
1.编程思想
面向过程编程 POP
面向过程就是分析解决问题所需要的步骤,然后把这些步骤一步一步实现,使用的时候再一个一个依次调用
例子:将大象装进冰箱,面向过程做法
1.打开冰箱门
2.把大象装进去
3.关上冰箱门
面向过程,就是按照我们分析好了的步骤,按照步骤解决问题
面向对象编程 OOP
面向对象是把事务分解成一个个对象,然后由对象之间分工与合作
1.大象对象 进去
2.冰箱对象 打开
关闭
3.使用大象和冰箱的功能
面向对象是以对象功能划分问题,而不是步骤
面向对象本质是:面向过程的封装
面向对象特征
1.封装性:
a.把代码放入对象的方法中
b.解决代码复用
c.避免全局变量的污染
2.继承性:一个对象拥有另一个对象 所有成员
3.多态性:一个对象在不同情况下的不同状态
2.构造函数
特点:1.构造函数体现了面向对象的封装性2.构造函数实例创建的对象彼此独立,互不影响
构造函数的问题:构造函数方法好用,但存在浪费内存问题(存复杂数据类型)
new在执行时会做四件事情:
1.在内存中创建一个新的空对象
2.让this指向这个新对象
3.执行构造函数里面的代码,给这个新对象添加属性和方法
4.返回这个新对象(所有构造函数中不需要return)
规范:命名首字母大写
构造函数return的使用
1.如果return的是值类型则无效
2.如果return的是引用类型则有效,会覆盖new创建的对象
3.原型对象
作用:解决构造函数浪费内存+变量污染的问题
原型prototype
原型的作用:共享方法与继承
是构造函数的一个属性,本质也是一个对象,也称prototype原型对象
特点:
1.构造函数通过原型分配的函数是所有对象所共享的
2.js规定,每一个构造函数都有prototype属性,指向另一个对象
3.我们可以把那些不变的方法,直接定义在prototype对象上,
这样所有对象的实例就可以共享这些方法
注意一:1.prototype就是一个对象,这个对象所有的方法和属性都会被构造函数所拥有2.构造函数里面的this指向是实例对象3.原型对象里面的this指向的还是实例对象
注意二:1.公共的属性写在构造函数里面2.公共的方法写在原型对象身上,构造函数名.prototype.方法名 = function(){}
constructor属性
对象原型proto 和 构造函数prototype原型对象中,里面有一个constructor属性constructor我们称为构造函数,因为它指回构造函数本身
目的:主要是记录该对象引用哪个构造函数,它可以让原型对象重新指向原来的构造函数
注意:1.上面被注释起来的意思是 Star的原型对象prototype的sing方法,是将sing方法添加进入原型对象自带的方法中
function Star() { }
Star.prototype.sing = function(){ }
Star.prototype.dance = function(){ }
2.当把方法都放在prototype对象中时,prototype对象 = 那些方法,而那些方法就相当于复制给了prototype对象,因此里面原本存在的constructor方法就会被覆盖掉,因此,我们需要自己指回
function Star() { }
Star.prototype = {
constructor:Star
sing:function(){},
dance:function(){}
}
3.手动指回:
constructor:构造函数名
对象原型_ _ proto _ _
1.对象都会有一个 _ _ proto _ _属性,指向构造函数的prototype原型对象
2._ _ proto _ _的存在,就可以直接去构造函数原型对象prototype中找
注意:
1._ _proto_ _是js非标准属性
2.[[prototype]]和_ _proto_ _意义相同
3.用来表明当前实例对象指向哪个原型对象
4._ _proto_ _对象原型里面也有一个constructor属性,指向创建该实例对象的构造函数
原型继承
父构造函数 子构造函数
子类的原型对象 = new 父类
原型链
原型链就是一个查找规则,遵循就近原则每一个实例对象都会有自己的原型,而原型的也是对象,那么它也拥有自己的原型,以此类推形成的链式结构,我们称为原型链
instanceof检测构造函数的原型对象是否出现在某个对象的原型链上
语法:实例对象 instanceof 构造函数
扩展内置对象
可以通过原型对象,对原来的内置对象进行扩展自定义方法,比如给数组增加自定义求偶数和的功能
注意:
1.数组和字符内置对象不能给原型对象覆盖操作Array.prototype = {}
2.只能Array.prototype.xxx = function() {}