面向对象概述
面向对象,全称为Object Oriented Programming 简称OOP。属于编程范式中的命令式编程。
面向对象特征
三大特征:封装、继承、多态
封装:内部运作隐藏在对象里面,只有基本功能暴露给最终用户
继承:子类继承父类
多态:不同的对象可以共享相同方法,还能用一些特定的方法来覆盖原有的方法
原型对象
在js中,每一个对象,都有一个原型对象,而原型对象上面也有自己的原型对象,一层一层向上找,最终会找到null。
1、js中每个对象都有一个原型对象,可以通过_proto_属性来访问到对象的原型对象。
2、通过_proto_属性一直向上寻找原型对象的话,最终会找到null
3、构造函数的prototype属性指向一个对象,这个对象是该构造函数实例化出来的对象的原型对象。
4、js中的根对象是Object.prototype,Object.prototype对象是一个空对象。
5、js中的每一个对象,都是从Object.prototype对象克隆而来的。Object.prototype对象就是他们的原型对象,而Object.prototype对象的原型是null。
基于对象创建新的对象
ES5中提供Object.create()方法,可以用来克隆对象
用这个方法克隆对象时,还可以传入第二个参数,第二个参数是一个JSON对象,里面可以书写新对象的一些属性的设定
例子:
const person = {
arms: 2,
legs: 2,
walk() {
console.log('walking');
}
}
const xiejie = Object.create(person, {
name: {
value: "xiejie",
writable: false,
enumerable: true
},
age: {
value: 18,
enumerable: false
}
});
console.log(xiejie.name); // xiejie
console.log(xiejie.age); // 18
console.log(xiejie.arms); // 2
console.log(xiejie.legs); // 2
for (let i in xiejie) {
console.log(i); // name arms legs walk
}
属性特性和描述符
可以使用Object.defineProperty()来设置属性特征
value: “xiejie”, //值
writable: false, //是否能够修改
enumerable: true //是否能够遍历出来
configuration //是否能够删除
注:基于对象创建新的对象,可以继承祖辈对象的属性和方法,这其实就是一个继承关系。
原型相关的方法
- prototype 和__proto__
prototype 是构造函数上面的一个属性,指向一个对象,这个对象是该构造函数实例化出来的对象的原型对象,实例化出来的对象可以通过_proto_来找到自己的原型对象
const arr = [1,2,3,4,5];
console.log(Array.prototype); // []
console.log(arr.__proto__); // []
console