一、 什么是面向对象,请简述?
1.面向对象就是把问题抽象成若干个对象,对象中共有的属性和方法可以封装到类中,让它们具有一定功能。类是具有相同或者相似性质对象的抽象。因此类是对象的抽象,对象是类的具体实现。
2.面向对象的三大特点:封装,继承,多态
3.面向对象的优点:易于维护,复用,扩展
4.面向对象的缺点:性能低,因为创建类需要很大的开销
二、简述原型、原型链、继承。
原型:
01>每一个构造函数都有一个protptype属性,这个属性就是原型对象。该原型对象上的属性和方法可以被该原型对象所属的构造函数实例化的对象访问。
02>js中每一个对象都继承自另一个对象,后者通常被称为原型对象。
原型链:
01>每一个对象身上都有一个_proto_属性,它指向该对象所在构造函数的原型对象,原型对象也是对象,它也存在 __proto__, 这样一级一级向上指向的规则就形式原型链。
02>原型链的作用是:在读取对象的某个属性时,js引擎会先寻找自身的属性,如果找不到,就去这个对象的原型对象上去找,如果还是找不到,就到原型的原型上去查找,直到Object.prototype还是找不到,就会返回undefined
3.继承:
01>继承是发生在两个构造函数或者两个类之间的,如果A构造函数使用了B构造函数的属性和方法,
我们就说A继承自B,B是父类,A是子类
02>借用父类构造函数继承:我们在子类构造函数中使用call或者apply 方法调用父类构造函数, 并改变其this指向为子类构造函数的this。此时子类就可以继承到父类构造函数中的属性和父类构造函数中的方法。
原型链继承: 将父类的实例化对象赋值给子类的原型对象,此时子类就继承了父类的原型对象上的属性和原型上的方法。
03> 由于面向对象的写法是将属性写在构造函数中,方法写在原型对象上,所以我们一般使用组合继承,也就是通过借用父类构造函数继承来继承父类的属性,原型链继承来继承父类原型上的方法
三、构造函数和普通函数的区别?
1. 返回值的类型不同:
构造函数的默认返回值是 this
普通函数的默认返回值是 undefined
2. 函数名的区别:
构造函数名必须保持和类名一致,要求首字母大写,一般是名词
普通函数的函数名遵循变量的命名规则即可,一般是动词
3. 调用方式的区别:
构造函数在调用时使用 new 来调用
普通函数之间使用 函数名() 来调用即可。
4. 作用上的区别:
构造函数目的用于实例化对象,通过对象调用构造函数中的方法来完成功能
普通函数的目的单纯的封装一个功能。
四、手写原型链继承的格式
function 构造函数1(形参1,形参2,形参3...){
this.属性名1=形参1;
this.属性名称2=形参2;
...
}
function 构造函数2(形参1,形参2, 形参3,...){
this.属性名1=形参1;
this.属性名称2=形参2 ;
...
}
构造函数2.prototype= new 构造函数1();
构造函数2.prototype.constructor=构造函数2的名称
五、手写构造函数继承的格式
function 构造函数1(形参1,形参2,形参3){
this.属性名1=形参1;
this.属性名称2=形参2;
this.属性名称3=形参3;
...
}
function 构造函数2(形参1,形参2, 形参3,...){
Father.call(this,形参1,形参2, 形参3)
...
}
let 实例对象= new 构造函数2(实参1,实参2,实参3)