js-高级01面向对象及创建对象

一,对象的定义
Everything is object (万物皆对象)
对象是单个事物的抽象。
对象是一个容器,封装了属性(property)和方法(method)
ECMAScript-262 把对象定义为:无序属性的集合,其属性可以包含基本值、对象或者函数
二,什么是面向对象
面向对象不是新的东西,它只是过程式代码的一种高度封装,目的在于提高代码的开发效率和可维护性。
面向对象编程 —— Object Oriented Programming,简称 OOP ,是一种编程开发思想。它将真实世界各种复杂的关系,抽象为一个个对象,然后由对象之间的分工与合作,完成对真实世界的模拟。
三,面向对象的特征
1,封装
2,继承
3,多态
四,面向对象与面向过程
1,面向过程就是亲力亲为,事无巨细,面面俱到,步步紧跟,有条不紊
2,面向对象就是找一个对象,指挥得结果
面向对象将执行者转变成指挥者
面向对象不是面向过程的替代,而是面向过程的封装
五,创建对象的三种方法
字面量形式
系统构造函数Object
自定义构造函数
创建一个实例对象,必须使用 new 操作符。以这种方式调用构造函数会经历以下 4 个步骤:
创建一个新对象
将构造函数的作用域赋给新对象(因此 this 就指向了这个新对象)
执行构造函数中的代码
返回新对象
实例对象中的constructor属性
对象的 constructor 属性最初是用来标识对象类型的
可以通过实例的 constructor 属性判断实例和构造函数之间的关系
注意:这种方式不严谨,推荐使用 instanceof 操作符,后面学原型会解释为什么
六,对象的原型
内存浪费问题
使用构造函数带来的最大的好处就是创建对象更方便了,但是其本身也存在一个浪费内存的问题
对于每一个实例对象,如果我们在一个实例对象的内部创建一个属性,值为函数。假如创建两个对象,属性名也许一致,看似都是一模一样的内容,但是其实每一次生成一个实例,都会多占用一些内存,如果实例对象很多,会造成极大的内存浪费。为了解决内存浪费问题,引入原型
基本解决对象数据共享(把公用属性值定义在外部)
Javascript 规定,每一个构造函数都有一个 prototype 属性,指向另一个对象。这个对象的所有属性和方法,都会被构造函数的实例继承。

任何函数都具有一个 prototype 属性,该属性是一个对象。
构造函数的 prototype 对象默认都有一个 constructor 属性,指向 prototype 对象所在函数。
通过构造函数得到的实例对象内部会包含一个指向构造函数的 prototype 对象的指针 __proto__。
实例对象可以直接访问原型对象成员。
总结:
任何函数都具有一个 prototype 属性,该属性是一个对象
构造函数的 prototype 对象默认都有一个 constructor 属性,指向 prototype 对象所在函数
通过构造函数得到的实例对象内部会包含一个指向构造函数的 prototype 对象的指针 __proto__
所有实例都直接或间接继承了原型对象的成员
为什么实例对象可以访问原型对象中的成员?
先在自己身上找,找到即返回
自己身上找不到,则沿着原型链向上查找,找到即返回
如果一直到原型链的末端还没有找到,则返回undefined
原生对象的原型即系统构造函数
Object.prototype
Function.prototype
Array.prototype
String.prototype
Number.prototype
Date.prototype
利用自调用函数把局部变量变为全局变量
好处
1,避免变量污染
2,把对象暴露给window已提升
函数是有参数的,我们可以通过把window对象传入而解决

 

posted @ 2020-08-04 15:46  帅气如我66  阅读(108)  评论(0编辑  收藏  举报