簡介:不少概念不清或忘記,從新構建本身的知識體系。天天問本身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