简介:不少概念不清或忘记,从新构建本身的知识体系。天天问本身1~多个问题。我是菜鸟 成为大神之路!
前端
new
和instanceof
的内部机制?用代码来阐述面试
// 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,也就是x
为y
的一个实例。不然返回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