一.对象
1.创建对象的三种方式:
- 字面量方式
- 调用系统的构造函数
- 自定义构造函数
2.实例对象和构造函数
原型链:
是实例对象和原型对象之间的关系,通过原型(__proto__)来联系的。
原型的指向是可以发生改变的。如果原型指向发生改变,应该在改变之后添加原型方法;
构造函数的原型对象(prototype)指向如果发生改变,实例对象的原型(__proto__)指向也会发生改变。
注:
1.实例对象的原型__proto__和构造函数的原型prototype的指向是相同的
2.实例对象中的__proto__原型指向---->构造函数的原型prototype对象
3.实例对象中的__proto__是原型,浏览器使用的;构造函数中的prototype也是原型,程序员使用的。
实例对象的__proto__原型 ---->构造函数的prototype原型里面的__proto__------>Object的prototype中的__proto__(null);
具体:
div.__proto__---->HTMLDivElement.prototype的__proto__---->Element.prototype的__proto__--->Node.prototype的__proto__---->EventTarget.prototyp的__proto__---->Object.prototype没有__proto__,所以Object.prototype的__proto__为null。
Js中,对象没有属性,只要对象.属性,则对象就有了该属性但是此属性并没有复制,会返回undefined而不会报错。
实例对象访问属性先去实例对象中找,找不到再去原型对象中找;
实例对象无法改变原型对象中的属性值,要想改变原型对象中的属性值,直接通过原型对象.属性=值来改变。
只要是对象就会有下划线原型(__proto__),下划线原型总是指向构造函数的原型对象。
原型作用:
1.数据共享,节省内存空间;
2.实现继承(父类与子类级别之间的关系)。
二.继承
定义:是类(class)与类之间的关系(js中没有类的概念,因此通过构造函数来模拟类,通过原型实现继承。)
目的:为了实现数据共享。
方法:通过改变原型的指向
1.原型继承
Student.prototype=new Person( 属性,属性,属性…..);
缺陷:属性在初始化时已经固定,如果是多个对象实例化那么每个实例对象的属性的值在初始化的时候都是一定的。
2.借用构造函数:
构造函数名字.call(当前对象,属性,属性...)来解决属性继承及值不重复问题;
Person.call(this,name,age,sex,weight);
缺陷:方法不可以继承。
3.组合继承:
原型继承+借用构造函数继承
解决了属性和方法的继承问题。
4.拷贝继承:(分为深浅拷贝 见https://blog.csdn.net/weixin_41082623/article/details/88084831)
把一个对象中的属性或者方法直接复制到另一个对象中
var obj2={};
for(var key in Person.prototype){
obj2[key]=Person.prototype[key];
}
三.函数
函数的调用方式:
1.普通函数:直接调用
2.构造函数:通过new创建对象来调用
3.对象的方法:先通过new创建对象在用对象.方法来调用
注意:
函数是对象,对象不一定是函数;
所有的函数都是由Function的构造函数创建出来的实例对象。