面向对象 继承方式 函数原型关系

2018-01-27  本文已影响0人  不正经开发者

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 构造函数

上一篇 下一篇

猜你喜欢

热点阅读