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本身,并不会修改原型链 。
本文相关标签: 原生JS
发表评论: