博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
学习new和instanceof知识小结
阅读量:6458 次
发布时间:2019-06-23

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

new和instanceof

new

代码例子

var Func=function(){};var func=new Func ();复制代码

new共经过4个阶段

  1. 创建一个空对象
  2. 设置原型链
  3. Func中的this指向obj,并执行Func的函数体。
  4. 判断Func的返回值类型,如果是基本值类型,返回obj;如果是引用类型,就返回这个引用类型的对象。 模拟实现new
function create() {    // 创建一个空的对象    let obj = new Object()    // 获得构造函数    let Con = [].shift.call(arguments)    // 链接到原型    obj.__proto__ = Con.prototype    // 绑定 this,执行构造函数    let result = Con.apply(obj, arguments)    // 确保 new 出来的是个对象    return typeof result === 'object' ? result : obj}复制代码

instanceof

instanceof运算符用于判断一个对象的原型链是否存在一个构造函数的prototype属性。

语法:object instanceof constructor
参数:object(要检测的对象) constructor(某个构造函数)
描述:instanceof运算符用来检测constructor.prototype是否存在于参数object的原型链上

下面通过代码阐述instanceof的内部机制,假设有x instanceof y一条语句,则其内部实际做了如下判断:

while(x.__proto__!==null) {    if(x.__proto__===y.prototype) {        return true;        break;    }    x.__proto__ = x.__proto__.proto__;}if(x.__proto__==null) {
return false;}复制代码

x会一直沿着隐式原型链__proto__向上查找直到x.__proto__.__proto__...===y.prototype为止,如果找到则返回true,即xy的实例,否则返回falsex不是y的实例。

相关面试题

function F() {}function O() {}O.prototype = new F();var obj = new O();console.log(obj instanceof O); // trueconsole.log(obj instanceof F); // trueconsole.log(obj.__proto__ === O.prototype); // trueconsole.log(obj.__proto__.__proto__ === F.prototype); // true复制代码

根据new的内部机制改写代码

function F() {}function O() {}var obj = (function () {    var obj1 = {};    obj1.__proto__ = F.prototype; // new F();    O.prototype = obj1; // O.prototype = new F();    obj.__proto__ = O.prototype; // new O();    obj.__proto__ = obj1;    return obj;})()复制代码

如果改一下代码顺序,结果将不同

function F() {}function O() {}var obj = new O();O.prototype = new F();console.log(obj instanceof O); // falseconsole.log(obj instanceof F); // falseconsole.log(obj.__proto__ === O.prototype); // falseconsole.log(obj.__proto__.__proto__ === F.prototype); // false复制代码

关于原型链的详解后续文章会讲到

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

你可能感兴趣的文章
内容开发平台(PLATFORM)
查看>>
java值传递
查看>>
判断一个数是否为素数的一个讨论(一)
查看>>
DB2与oracle有什么区别
查看>>
创建一个多级文件目录
查看>>
Picasa生成图片幻灯片页面图文教程
查看>>
js获取当前时间的前一天/后一天
查看>>
[洛谷P3978][TJOI2015]概率论
查看>>
Python学习——编程语言介绍
查看>>
Python字符串的格式化
查看>>
C#反射---属性
查看>>
服务器常用的状态码及其对应的含义如下
查看>>
完美字符串
查看>>
我为什么要写LeetCode的博客?
查看>>
zoom和transform:scale的区别
查看>>
Plplot中line width 问题
查看>>
js中(function(){…})()立即执行函数写法理解
查看>>
QQ空间Python爬虫(2)---分析json
查看>>
NEU OJ 1651 Great number
查看>>
VSCode + PYQT5 + QtDesigner 环境搭建和测试
查看>>