原型链(一):辨别原型链的两种方法

来源:互联网 发布:顶级网络12职业传奇 编辑:程序博客网 时间:2024/04/30 13:23

      JS对象查找属性与方法时,除了优先会从自身查找,还会不断追溯自己的原型祖先,自到追溯到Object对象的原型为止。

      基于JS对象原型的这种特征,为了保证调用正常,经常需要判断对象之间是否存在原型关系,这里提供两种方法,分别是getPrototypeOf与isPrototypeOf,示例代码如下:

//  图形通用原型var shapeProto = {        getType () {            return this.type !== undefined ? this.type : 'Shape';        }    },    circleProto;//  声明形状类function Shape(type) {    this.type = type;}//  设置Shape的原型Shape.prototype = shapeProto;//  创建圆形类function Circle(radius) {    this.radius = radius;    this.getRadius = function() {        return this.radius;    }}//  设置圆形类的原型circleProto = new Shape('Circle')Circle.prototype = circleProto;//  初始化圆形对象var c1 = new Circle(10);alert(c1.getType());    //  输出Circle

      现在,Circle对象的原型链为circleProto => shapeProto => Object.prototype,查找属性与方法时会依次往上查找,为了判断对象之间的原型依赖关系,可以采用如下的方法。

1.getPrototypeOf,用于查找原型链的直接父原型

//  只能获取直接父原型alert(Object.getPrototypeOf(c1) === circleProto);   //  输出truealert(Object.getPrototypeOf(c1) === shapeProto);    //  输出false

      利用getPrototypeOf的这个特性,我们可以轻松获得对象的原型链,如下:

//  获取对象的原型链function getPrototypeChain(obj) {   var result = [],       proto = obj;   while(proto != null) {        proto = Object.getPrototypeOf(obj);        if(proto != null) {            result.push(proto);            obj = proto;        }    }    return result;}//  protoChain为[circelProto, shapeProto, Object.prototype]var protoChain = getPrototypeChain(c1); 

2.isPrototypeOf,能对原型链上的所有对象进行判断

alert(circleProto.isPrototypeOf(c1));   //  输出truealert(shapeProto.isPrototypeOf(c1));    //  输出true    
1 0
原创粉丝点击