面向对象语言,就是掌握‘类’,‘对象’,‘实例’的相关知识以及他们间的关系。如‘类’的封装、继承和多态。
- 对象:万物皆对象,各种事物都可成为我们的研究对象。
- 类:对具有相同属性的各对象的共同部分进行分类、提取,封装。如‘人’这个类中,‘性别’就是人的属性之一。
- 实例:从类中派生出来的就称为实例。实例既有自己的私有属性,也有从类中继承来的公有属性。
js中类的封装、继承和多态
-
js中类的实现是通过原型和原型链实现的
1.1, 原型:每一个函数数据类型的值,都含有prototype(原型)属性(这个属性是天生自带的)。这个属性值是一个对象,用来存储实例的公用属性和方法。
1.2, 在prototype这个属性对象中,都包含一个constructor属性(也是天生自带),这个属性指向函数本身。(类似于C++中的构造器)
1.3, 每一个对象数据类型的值,都含有私隐原型属性'proto',该值指向对象所属类的原型(prototype)
2.1, 原型链:每个对象都含有私隐原型proto,并且指向所属类的原型,所以每个对象都会通过原型这个属性与上级连接,我们就把这种通过原型属性进行连接的方式叫做原型链。
2.2, 原型链的查找机制:先在自己的私有属性上查找,没有找到就通过proto这个属性向自己所属类的原型prototype进行查找,如果没有再通过原型的proto继续向上寻找,直到寻找到基类Object.prototype为止。(Object为基类,所以它的proto为null)。
3.1, 这种原型链的查找机制也就是js中类的继承和多态的实现机制,如下:
例子1:function Person(name, age){ this.name = name this.age = age } Person.prototype.speak = function(){ console.log('i can speak chinese') } let p1 = new Person('小明',18) p1.speak = function(){ console.log('i can speak english') } console.log(p1.speak()) // 'i can speak english' let p2 = new Person('小红',22) console.log(p2.speak()) // 'i can speak chinese'
例子2:
通过hasOwnProperty可以检查某个属性是否为该对象的私有属性
let ary = [1,2,3]
console.log(arr.hasOwnProperty('push')) // false 因为'push'是数组类(Array)的公有属性,而非当前实例'ary'的私有属性
- 通过'in'可以检查某个属性是否为该对象具有的属性(包含公有和私有属性)
let ary = [1,2,3]
console.log('push' in ary) // true