javascript继承

作者: 阿蒙 时间: 2015-2-3 标签: JavaScript 浏览: 2144 评论: 0

例:


 function inherit(p){
    if (p == null) throw TypeError; //p是一个对象 但不是null
    if (Object.create){
        return Object.create(p); // 如果Object.create()存在则直接使用它
    }else {
        var t = typeof p;    //否则进一步检测
        if (t !== "Object" && t !== "function"){ throw TyoeError(); }
        function f(){};  //定义一个空构造函数
        f.prototype = p;    // 将其原型属性设置为 p
        return new f();        // 使用f()创建p的继承对象
    }

}

假如要查询对象o的属性x, 如果o中不存在x,那么将会在o的原型对象中查询属性x.
如果原型对象中也没有x, 但这个原型对象也有原型,那么继续在这个原型对象的原型上执行查询,
知道到x或者查找到一个原型是null的对象为止。对象的原型属性构成了一个"链",通过这个"链"可以实现属性的继承。

var o = {};    //o 从 Object.prototype继承对象的方法
o.x = 1;     //给o定义个属性x
var p = inherit(0);    //p继承o和Object.prototype
p.y = 2; //给p定义一个属性y
var q = inherit(p); //q继承p, o 和Object.prototype
q.z = 3; //给q定义一个属性z
var s = q.toString(); // toString继承自Object.prototype
q.x + q.y     // => 3: x 和 y分别继承自 o和p 


属性赋值操作首先检查原型链,以此判定是否允许赋值操作。如果允许属性赋值操作 ,它也总是在原始对象上创建属性
或者对已有的属性赋值,而不会去修改原型链。
在javascript中,只有查询属性时才会体会到继承的存在,而设置属性则和继承无关,
该特性让程序员可以有选择的覆盖继承的属性
例2:
  var unitcircle = {r:1};    //一个用来继承的对象
    var c = inherit(unitcircle);    //c继承属性r
    c.x= 1; c.y = 1;        //c定义两个属性
    c.r= 2;        //c覆盖继承来的属性
    unitcircle.r;        // => 1, 原型对象没有修改.
   



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

0

本文相关标签: 原生JS

赞助商

发表评论: