1、面向对象三大特征:封装、继承、多态
封装:将功能封装整合在对象内,只对外界暴露指定接口,外界使用只需考虑接口的使用。
继承:JS中的继承是对象和对象之间的继承,如果一个对象想拥有另外一个对象的成员,就可以让这个对象继承自另外一个对象。
多态:JS没有多态。
2、继承的实现方式
①混入式继承
for in { 对象[key]=继承对象[key] }
②替换原型方式实现继承
构造函数.prototype=继承对象
好处:能直接所有添加使用
弊端:会把之前原型内的对象替换掉为要继承的对象
③混合式继承
for in { 对象.prototype[key]=继承对象[key] }:没有替换原型,只是往原型中添加成员
3、原型链
每个对象都有原型,原型也是一个对象,所以原型又有原型,形成一个链式结构,即原型链。
对象访问属性和方法的规则:如果自己里面有这个成员,就访问自己的;如果自己没有,就去原型中查找;如果原型中没有找到,就沿着原型链接上往上查找,直到找到为止;如果到头都没找到,就返回undefined或报错。
不管是哪个对象,最终的原型链尽头都是 Object.prototype
意味着Object.prototype这个原型里面的成员,不管是哪个对象都可以访问
4、Object.prototype的成员介绍
hasOwnProperty:判断自己本身是否有这个属性
对象.hasOwnProperty(属性)
属性 in 对象:判断自己能不能访问某个属性
isPrototypeOf:判断一个对象是不是另一个对象的原型
对象1.isPrototypeOf(对象2)
propertyIsEnmuerable:判断属性是否是属于自己的
判断属性是否是可以遍历的
只有两个都成立,结果才为true
对象.propertyIsEnmuerable(属性)
valueOf:原始值
*不推荐直接给内置构造函数的原型扩展方法或者属性。
6、函数是一个对象 (构造函数也是一样)
查看函数对象:console.dir()
这个函数是由哪个构造函数创建出来的?Function
7、函数对象中常用的属性
函数名.caller:一个函数在哪个函数体里面被调用,那么这个函数的caller就是那个函数。(如果这个函数是直接调用,那么这个函数的caller就是null)
函数名.length:代表的是形参的个数
函数名.name:代表的是函数名
函数名.arguments:代表的是实参 (函数名.arguments 这个不常用)
(函数名.arguments === arguments)//false
arguments:伪数组,但也是一个对象(arguments.push()没有这个方法)
对象里的属性:arguments.callee 函数本身
8、instanceof:判断构造函数的prototype属性在不在某个对象它的原型链上
语法:对象 instanceof 构造函数
网友评论