原型和原型链 及 instanceof函数


一、原型(prototype)

  • 定义:一个简单的对象,用于实现对象的属性继承。可以简单理解成对象的爹。在Firefox和Chorme中,每个JS对象中都包含一个__proto__(非标准)的属性指向该对象的原型,可obj.__proto__进行访问
  • 实例是通过构造函数(new)创建出来的对象,实例通过__proto__指向原型,通过constructor指向构造函数
  • 以上描述可表示为:var a = new Object(); a.__proto__ === a.contructor.prototype

二、原型链(prototype chain)

  • 原型链是由原型对象组成,每个对象都有一个__proto__属性,指向了创建该对象的构造函数的原型,__proto__将对象链接起来组成了原型链。是一个用来实现继承和共享属性的有限的对象链。
  • 在 javaScript 中,每个对象都有一个指向它的原型(prototype)对象的内部链接。这个原型对象又有自己的原型,直到某个对象的原型为 null 为止(也就是不再有原型指向),组成这条链的最后一环。这种一级一级的链结构就称为原型链(prototype chain)
function A(){};
var a = new A();
// a  ===> a.__proto__(A.prototype) ===> A.prototype.__proto__(Object.prototype) ===> Object.prototype.__proto__ ===> null

三、instanceof函数

定义:instanceof运算时会递归查找L的原型链,即 L.__proto__.__proto__.__proto__.__proto__...直到找到了或者找到顶层为止。一句话理解instanceof的运算规则为: instanceof检测左侧的__proto__原型链上,是否存在右侧的prototype原型。
有一个有趣的现象:
Function instanceof Object; // true
Object instanceof Function; // true
为何 Object instanceof Function为true?
  • Object, Function, Array等等这些都被称作是构造“函数”(想一下我们可以var a = new Object()来创建一个对象,所以Object本身就是一个构造函数),他们都是函数。而所有的函数都是构造函数Function的实例。
  • 从原型链机制的的角度来说,即Function.prototype在Object的原型链上。Function这个内置函数的Function.prototype是一个函数a,因为函数同时也是对象,因此这个函数a也定义了apply、call、bind等属性(或者说方法)。而Object的委托目标Object.__proto__正是这个函数a,代码表示为:Function.prototype === Object.__proto__ // true
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值