对象(四继承)

22 篇文章 0 订阅
15 篇文章 0 订阅

6.2.2继承

JavaScript 对象具有“自有属性”(own property)
,也有一些属性时从原型对象继承而来的。为了更好地理解这种继承,必须深入地了解属性访问细节
。本节中的许多示例代码借用了例6-1中的inherit()函数,通过给它传入指定原型对象来创建实例。假设要查询对象o的属性x,如果o中不存在x
,那么将会继续在o的原型对象中查询属性x。如果原型对象中也没有x,但是这个原型对象也有原型,那么继续在这个原型对象上执行查询,知道找到x
或者查找到一个原型是null的对象为止。可以看到,对象的原型属性构成了一个“链”,通过这个“链”可以实现属性的继承。

    <script type="text/javascript">
            var o ={};//o 从Object.prototype继承对象的方法
            o.x = 1;//给o定义一个属性x
            var p = inherit(o);//p继承o和Object.prototype
            p.y = 2;//给p定义一个属性y
            var q = inherit(p);//q继承p、o和Object.prototype
            q.z = 3;
            var s = q.toString();//toString继承自Object.prototype 
            q.x + q.y ;//结果为3 xy 分别继承o和p
        </script>

现在假设给对象o的属性x赋值,如果o中已经有属性x(这个属性不是继承来的),那么这个赋值操作只改变这个已有属性x的值。如果o中不存在属性x
(这个属性不是继承来的),那么这个赋值操作只改变这个已有的属性x的值。如果o中不存在属性x,那么赋值操作给o添加一个新属性x。如果之前
o继承自属性x,那么这个继承属性就被新创建的同名属性覆盖了。
属性赋值操作首先检查原型链,以此判定是否允许赋值操作。例如,如果o继承自一个只读属性x,那么赋值操作是不允许的(6.2.3节将对此进行
详细讨论)。如果允许属性赋值操作,它也总是在原始对象上创建属性或对已有的属性赋值,而不会去修改原型链,在JavaScript中,只有在查询
属性时才会体会到继承的存在,而设置属性则和继承无关,这是JavaScript的一个重要特性,该特性让程序员可以有选择地覆盖(override)继承的属性

     <script type="text/javascript">
            var unitcircle = {r:1};//一个用来继承的对象
            var c = inherit(unitcircle);//c继承属性r
            c.x = 1;
            c.y =1;
            c.r = 2;//c覆盖继承来的属性
            unitcircle.r ;//原型对象没有修改
        </script>

属性赋值要么失败,要么创建一个属性,要么在原始对象中设置属性,但有一个例外,如果o继承自属性x,而这个属性是一个具有setter方法
的accessor属性(参照6.6节),那么这时候将调用setter方法而不是给o创建一个属性x。需要注意的是,setter方法是由对象o调用的,而不是
定义这个属性的原型对象调用的。因此如果setter方法定义任意属性,这个操作只是针对o本身,并不会修改原型链。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值