填坑-十万个为何?(15)

简介:不少概念不清或忘记,从新构建本身的知识体系。天天问本身1~多个问题。我是菜鸟 成为大神之路!前端

1. newinstanceof的内部机制?

  • 建立一个新对象,同时继承对象类的原型,即Person.prototype;
  • 执行对象类的构造函数,同时该实例的属性和方法被this所引用,即this指向新构造的实例;
  • 若是构造函数return了一个新的“对象”,那么这个对象就会取代整个new出来的结果。若是构造函数没有return对象,那么就会返回步骤1所建立的对象,即隐式返回this。(通常状况下构造函数不会返回任何值,不过在一些特殊状况下,若是用户想覆盖这个值,能够选择返回一个普通的对象来覆盖。)

用代码来阐述面试

// let p = new Person()
let p = (function () {
    let obj = {};
    obj.__proto__ = Person.prototype;
    
    // 其余赋值语句...
    
    return obj;
})();
复制代码

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

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

x会一直沿着隐式原型链__proto__向上查找直到x.__proto__.__proto__......===y.prototype为止,若是找到则返回true,也就是xy的一个实例。不然返回false,x不是y的实例。 举一反三post

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的内部机制改写上面代码ui

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;
})();
复制代码

复制代码结合instanceof内部机制很容易得出正确答案。 若是稍微调整一下代码顺序,结果将迥然不一样this

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
复制代码

参考文章:
腾讯前端面试篇(一)spa

相关文章
相关标签/搜索