js高级-面向对象
js高级面向对象
一、什么是对象 万物皆对象
1、对象是单个事物的抽象
2、对象是一个容器,封装了属性(property) 和方法( method)
3、对象是数据集或功能集
4、对象是无序属性的集合
二、什么是面向对象
是一种编程开发思想。
它将真实世界各种复杂的关系,抽象为一个个对象,然后由对象之间的分工与合作,完成对真实世界的模拟。
三、面向对象的特征
1、封装
2、继承
3、多态
constructor //构造函数;构造者;建造者
结论:任何一个对象都有constructor 属性,实例化对象的constructor 属性指向构造函数;
1、BOM对象
2、DOM对象
3、内置对象
4、自定义对象
5、数组也是对象,广义上的对象
6、函数也是对象,广义上的对象
instanceof (狭义)
如果要检测对象的类型,还是使用 instanceof 操作符更可靠一些,返回true为对象
变量/值 instanceof Object
js拥有内存自主回收机制
内存的生命周期
内存的分配: 变量的定义 函数的声明
内存的使用: 变量的使用 函数的调用
内存的销毁: 浏览器的关闭 函数调用的完成
构造函数浪费内存问题
1、将公共的属性放到全局
2、可以将公共的方法写到全局
3、原型
四、原型
一、原型的作用:
1、节省内存空间
2、实现数据共享(继承)
二、什么是原型
任何一个函数都有prototype属性,他本身就是一个对象,我们称之为原型
三、构造函数和实例化对象和原型之间的关系
1、任何一个函数都有prototype属性,他本身就是一个对象,我们称之为****原型
2、构造函数也是函数,也有prototype属性,他本身就是一个对象,我们称之为原型
3、构造函数的原型对象的属性和方法可以被实例化对象所继承
4、任何一个对象都有constructor属性,实例化对象的constructor 属性指向的是构造函数
5、原型也是对象,也有constructor属性,原型对象的constructor属性指向的是构造函数
6、任何一个对象都**proto属性,实例化对象的__proto__属性指向构造函数的原型**
五、函数中this的指
在原型函数中
用实例化对象调用函数,this指向****实例化对象
用原型对象调用函数,this指向****原型对象
new关键字的作用
1、创建一个新对象,返回一个新对象
2、改变构造函数中this的指向,指向实例化对象
new关键字的底层原理
1、var p1 = {} 创建了一个对象
2、p1.__proto__ == Person.prototype p1的指针指向构造函数的原型,原型对象中的属性和方法可以被继承
3、Person.call(p1) 调用函数,改变this指向
function Person(name) {
this.name = name
}
Person.prototype.age =18
var p1 = new Person('aaa')
原型链
一、在javascript中每个对象都会有一个__proto__属性,当我们访问一个对象的属性时,如果这个对象内部不存在这个属性,那么它就会去__proto__里去找这个属性,这个__proto__又会有自己的__proto__,于是就这样一直找下去,这就是原型链的概念。
二、原型链最终指向 null
三、原型链的查找规则
按照原型链依次往下找,有就返回,没有就返回undefined或者报错
四、用字面量创建原型带来的的问题
直接加上constructor即可
五、将局部变量改成全局变量
改变This指向
一、 call()
1、可以进行函数的调用
2、可以改变this指向,如果没有参数this指向全局
3、可以改变this指向,如果有一个参数,this指向该参数
4、可以改变this指向,如果有多个参数,this指向第一个参数,其他参数是参数列表 **
二、apply()
1、可以进行函数的调用
2、可以改变this指向,如果没有参数this指向全局
3、可以改变this指向,如果有一个参数,this指向该参数
4、可以改变this指向,如果有多个参数,this指向第一个参数,第一个参数必须有,其他参数是数组
三、bind()
1、不可以进行函数的调用
2、可以改变this指向,如果没有参数this指向全局
3、可以改变this指向,如果有一个参数,this指向该参数