美文网首页
学习new和instanceof知识小结

学习new和instanceof知识小结

作者: LHH大翰仔仔 | 来源:发表于2019-01-15 22:12 被阅读61次

    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); // true
    console.log(obj instanceof F); // true
    console.log(obj.__proto__ === O.prototype); // true
    console.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); // false
    console.log(obj instanceof F); // false
    console.log(obj.__proto__ === O.prototype); // false
    console.log(obj.__proto__.__proto__ === F.prototype); // false
    

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

    欢迎关注

    相关文章

      网友评论

          本文标题:学习new和instanceof知识小结

          本文链接:https://www.haomeiwen.com/subject/lxvudqtx.html