1、什么是对象
汽车不是对象是是一类事物,一辆汽车是对象。
2、什么是面向对象
3、面向对象的特点
案例来理解 面向过程 和 面向对象---打印出学生的成绩表
面向过程:如何做这件事情 ,把事情拆成一个个的,然后一步步做?
面向对象:考虑这件事情可以抽象出哪些对象?对象有哪些成员---不着急先去做这件事情
注意:es6开始已经支持类了
4、如何创建对象
在面向对象的过程中我们要创建对面,创建对象的方式
1、字面量
2、new Object()
3、工厂函数方式
4、构造函数---函数名首字母大写
new 之后发生了什么
5、判断对象的具体类型
6、对象的静态成员和实例成员
7、构造函数的原型和三角关系
解决方式2:构造函数的原型
所有的构造函数内部都有一个属性叫原型(原型对象)---原型的本质就是一个普通的对象,所以可以动态的添加成员
对象可以访问所有原型对象的成员
占的是同一个内存空间,地址是相同的,地址指向sayHi
!!!我们通过原型对象添加的成员(属性和方法)和我们在构造函数中添加的成员(属性和方法)有什么区别呢?
认识:proto属性 ---实例化的对象的这个__proto__属性里面的成员就是在构造函数原型对象上添加的成员
所有的构造函数内部都有一个属性叫原型(原型对象)---原型的本质就是一个普通的对象,所以可以动态的添加成员
所有的对象都有一个__proto__属性
1、构造函数的原型(原型对象)---所有的构造函数都有原型prototype,实例化出的对象可以直接访问原型上的成员(所以一般把公共的方法放在原型上,节约内存优化性能);
2、对象的proto属性---所有的对象都有proto属性,proto属性和该对象的构造函数的原型相等,即proto属性又指向了原型对象;
为什么对象要有proto这个属性呢?(为了对象可以直接访问原型中的成员)
因为对象可以访问到构造函数中的原型对象的成员,所以对象中要有一个属性去引用(指向)prototype,即proto === prototype
3、constructor属性(构造函数/构造器)---是原型中的一个属性,记录了创建该对象的构造函数 ;
----以上3者的作用和联系
原型对象的proto又指向谁呢?
8、原型链
充分运用了原型对象
所以的对象都有proto
proto又指向原型对象
这就是一个往上的链
a、理解 var obj = new 构造函数 () 后发生的事情,就可以理解哪些成员是对象自身的而不是原型上的。
new 构造函数 () 发生的事情:
1、创建一个空对象 2、this指向这个空对象
3、调用构造函数,执行构造函数里面的代码(所以对象自身的成员就是在构造函数中定义的成员) 4、返回刚刚创建出的那个对象给obj。
b、对象访问成员是(就近原则):先找对象自身有没有这个成员,没有的话就往原型上找,原型也是对象,那又可以往原型对象的原型上找。。。以此类推找到最顶端
c、原型链的运用
d、对象中设置属性和读取属性的区别
e、使用原型的注意点
构造函数才有prototype原型属性
a、注意点1:
1、设置对象的方法时:方法一(不方便,代码重复)
2、设置对象的方法时:方法二(注意要重新设置constructor属性)
b、注意点2
9、原型对象的一个应用:扩展内置对象中的方法
比如:想求数组中所有偶数的和