原型链(一):辨别原型链的两种方法
来源:互联网 发布:顶级网络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
- 原型链(一):辨别原型链的两种方法
- 函数的原型。。。原型链
- 原型链的两种继承方式及区别
- 原型的两种方式
- 原型与原型链
- 原型 和 原型链
- 原型与原型链
- 原型以及原型链
- JS原型、原型链
- 原型与原型链
- 原型与原型链
- JS-原型、原型链
- 原型、原型链
- JavaScript原型,原型链
- JavaScript-原型、原型链
- 原型和原型链
- 原型与原型链
- 原型与原型链
- leetcode 354 Russian Doll Envelopes 二元组最长递增子序列
- Shader特效——“Kuwahara Filter”的实现 【OpenCV】【GLSL】
- java 做外挂 内联汇编
- 错误: 无法导入 wsdl:portType详细信息: 在运行 WSDL 导入扩展时引发异常:
- Maven服务的配置使用
- 原型链(一):辨别原型链的两种方法
- java.lang.UnsupportedClassVersionError
- 队列的基本操作
- HDU 5823 color II
- QT+Opencv视频文件TCP网络传输
- strcpy函数的用法
- 3052: [wc2013]糖果公园
- 灰度图像拉伸方法
- 各种查找的实现Java