---恢复内容开始---
一、面向对象:通过函数封装得到一个类
备注:类的本质还是属性
-
- 每个类(函数)天生有一个prototype的属性,这个prototype又是一个对象,这个对象里有个constructor(构造函数)的属性,属性值是类本身。
- 我们所有new一个类的时候,其实是调用它的构造函数。构造函数里的属性都是私有的,构造函数里的this都是实例对象。
每个对象上天生有一个__proto__,指向类的原型。
Prototype和__proto__
-
- prototype是类的或函数的,__proto__是对象的
- Prototype是存储机制,程序员来实现。__proto__是查找机制(浏览器的)
Zhangsan.name
Zhangsan这个对象首先看name是私有的,是就直接使用,不是就通过__proto__往他的类的prototype上查找,有就直接使用,没有就继续向上查找,直到查找到基类Object,没有就是undefined,有就直接使用。这种查找机制叫原型链。
二、函数的特殊
- 类
- 函数
- 对象
- 每个函数天生有一个返回值,return的是什么就是什么,如果没有return就是undefined
三、继承js
- 原型继承 经父类的实例赋值给子类的原型;私有的 公有的都继承为公有的。
2.Call继承 call方法是函数/类天生自带的一个方法。将父类私有的继承为子类私有的
类 私有的 公有的
Fn.call(obj,跟fn的参数匹配);拿obj取代fn中的this然后调用fn
3.冒充对象继承 将父类私有的和公有的都继承为子类私有的。使用for in
可以遍历对象的公有属性 fn 就是公有的
冒充对象的案例
4.混合继承 私有的继承为私有的 私有的和公有的再次继承为公有的。
Call 继承和原型继承的结合
5.组合继承 私有继承为有 公有继承为公有‘
私有继承为私有 借助call 公有继承为公有 不能是原型赋值给原型(地址赋值)因为原型是对象,是复合数据类型,是地址赋值给了前者,导致二者指向同一个原型。得克隆。
Js的克隆如何实现 var obj2=Object.create(obj1)
6.中间类继承
四、面向对象的三大特性:
1、封装
隐藏对象的属性和实现细节,仅对外提供公共访问方式,将变化隔离,便于使用,提高复用性和安全性。
2、继承
提高代码复用性;继承是多态的前提。
3、多态
父类或接口定义的引用变量可以指向子类或具体实现类的实例对象。提高了程序的拓展性。
- call可以传多个参数 apply只能传两个参数 apply的第二个参数必须是数组
- call和apply都是修改函数中this的指向的
- 第一个参数都是对象,用于替换函数中的this的,如果不想替换this写成null就行
---恢复内容结束---