new操做符實現原理:
function news(func) {
var target = {};//生成新對象
target.__proto__ = func.prototype;//實例的__proto__指向原型,構造函數的prototype也指向原型(連接到原型)
var res = func.call(target);//把函數的this綁定在了新生成的對象中
if (typeof (res) == "object" || typeof (res) == "function") {
return res;//若是傳入的函數(構造函數)有本身的返回值,則返回該值
}
return target;//若是若是傳入的函數(構造函數)沒有本身的返回值,則返回新對象
}
若是暫時看不明白,請往下看:函數
1.明白new的原理首先咱們須要明白原型,構造函數,實例的關係this
寫明是栗子,以函數Father爲例,函數Father就是一個構造函數,咱們能夠經過它構建一個實例spa
function Father() {
let colors = [1,2,3];
return colors;
}
const instance = new Father();
此時,instance爲實例,構造函數爲Father,構造函數擁有一個prototype的屬性指向原型。prototype
所以原型爲:code
const prototype = Father.prototype;
所以看得出三者的關係:對象
實例.__proto__===原型
原型.constructor === 構造函數
構造函數.prototype === 原型
實例.constructor === 構造函數
例子:blog
function instanceFun(){
this.colors=['res','pink','black']
}
const instance = new Father();
console.log(instanceFun.prototype.constructor,'構造函數');
console.log(instance.__proto__,'實例訪問原型');
console.log(instanceFun.prototype,'構造函數訪問原型');
console.log(instance.constructor,'實例的構造函數');
2.new運算符的執行過程繼承