博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【javascript 基础篇】prototype & constructor & instanceof
阅读量:6295 次
发布时间:2019-06-22

本文共 2452 字,大约阅读时间需要 8 分钟。

【javascript 基础篇】prototype & constructor & instanceof

之前每件事都差不多,直到现在才发现差很多。

现在才发现理清一件事的原委是多么快乐的一件事,我们共同勉励。

懒得扯淡,直接正题

不基于例子的讲原理都是扯淡,知乎一样的举例都是卖弄

例子

function A () {};A.prototype = {};function B () {};var a = new A();B.prototype  = new A();var b = new B();console.log(a.constructor); //Objectconsole.log(A.constructor); //Functionconsole.log(a.hasOwnProperty('constructor')); // falseconsole.log(A.hasOwnProperty('constructor')); // falseconsole.log(a instanceof A); // trueconsole.log(b.constructor); // Objectconsole.log(B.constructor); // Functionconsole.log(b.hasOwnProperty('constructor')); // falseconsole.log(B.hasOwnProperty('constructor')); // falseconsole.log(b instanceof B); // trueconsole.log(b instanceof A); // true

prototype

constructor

例子分析

console.log(a.constructor); //Objectconsole.log(A.constructor); //Functionconsole.log(b.constructor); // Objectconsole.log(B.constructor); // Function

首先需要明确 constructor 属性是 Object.prototype 对象上的, Object.prototype.hasOwnProperty('constructor') === true,而实例对象上的 constructor 属性是从其原型链中取。

  1. a的原型对象是A.prototype,指向了一个空对象,所以从Object.prototype 里面 查找 constructor 属性,返回 Object
  2. 任何一个函数都是都是 Function 的一个实例,Function.prototype.constructor === Function
  3. 再看一下 b,是 B 的实例,B 的 prototype 指向了 A 的实例,所以 b.constructor = a.constructor === Object
  4. B.constructor 同 第二种情况一样

instanceof

语法

object instanceof constructor# 参数- object 检测的对象- constructor 构造函数

用途

检测 constructor.prototype 是否存在于object的原型链上

例子分析

# 此处为文章前面的例子,只是把对于 instanceof 的判断集中起来console.log(a instanceof A); // trueconsole.log(b instanceof B); // trueconsole.log(b instanceof A); // true

clipboard.png


看 有下面的例子(精简化)

function C(){} var o = new C();o instanceof C; // true,因为 Object.getPrototypeOf(o) === C.prototypeo instanceof Object; // true,因为Object.prototype.isPrototypeOf(o)返回trueC.prototype instanceof Object // true,同上C.prototype = {};var o2 = new C();o2 instanceof C; // trueo instanceof C; // false,C.prototype指向了一个空对象,这个空对象不在o的原型链上.

乍一看,上面的例子,始终对于最后 o instanceof C 返回 false 不理解,其实只要明白 object.__proto__ 和 Constructor.prototype 是两个引用值,在使用 Constructor 创建实例 object 时, object.__proto__ === Constructor.prototype,之后 object.__proto__ 改变和 Constructor.prototype 任意其一改变都会导致最后 object.__proto__ !== Constructor.prototype

hasOwnProperty

例子分析

console.log(a.hasOwnProperty('constructor')); // falseconsole.log(A.hasOwnProperty('constructor')); // falseconsole.log(b.hasOwnProperty('constructor')); // falseconsole.log(B.hasOwnProperty('constructor')); // false

constructor 属性是从原型对象上继承的

相关资料

转载地址:http://qpvta.baihongyu.com/

你可能感兴趣的文章
Android 高效安全加载图片
查看>>
vue中数组变动不被监测问题
查看>>
3.31
查看>>
类对象定义 二
查看>>
收费视频网站Netflix:用户到底想要“点”什么?
查看>>
MacOS High Sierra 12 13系统转dmg格式
查看>>
关于再次查看已做的多选题状态逻辑问题
查看>>
动态下拉菜单,非hover
查看>>
政府安全资讯精选 2017年第十六期 工信部发布关于规范互联网信息服务使用域名的通知;俄罗斯拟建立备用DNS;Google打击安卓应用在未经同意情况下收集个人信...
查看>>
简单易懂的谈谈 javascript 中的继承
查看>>
iOS汇编基础(四)指针和macho文件
查看>>
Laravel 技巧锦集
查看>>
Android 使用 ViewPager+RecyclerView+SmartRefreshLayout 实现顶部图片下拉视差效果
查看>>
Flutter之基础Widget
查看>>
写给0-3岁产品经理的12封信(第08篇)——产品运营能力
查看>>
ArcGIS Engine 符号自动化配置工具实现
查看>>
小程序 · 跳转带参数写法,兼容url的出错
查看>>
flutter error
查看>>
Flask框架从入门到精通之模型数据库配置(十一)
查看>>
10年重新出发
查看>>