new操作符的實現原理
阿新 • • 發佈:2018-11-06
new操作符的實現原理
new操作符的實現原理就4條
- 新建一個物件O,將O的
__proto__
屬性指向建構函式的原型屬性prototype
- 繫結建構函式的執行上下文到O上,並執行建構函式得到返回值S
- 如果S是一個物件,new 操作符返回的就是這個S物件
- 如果S不是一個物件,new 操作符返回的就是O
下面我們來構造一個new操作符,並演示一下new操作符
function myNew(func){ let O = Object.create(func.prototype); let S = func.call(O); return typeof S === 'object' ? S : O; } function Person(){ this.name = 'xx' } let o1 = new Person; let o2 = myNew(Person); console.log(o1); console.log(o2); //Person {name: "xx"} //Person {name: "xx"} o1.__proto__ === o2.__proto__;//true o2.__proto__ === Person.prototype;//true
可以看到o1和o2的屬性是一樣的
下面我們再看看建構函式返回一個物件是什麼情況
function Person2(){ this.name = 'yy'; return { test:'ttt' } } let o3 = new Person2(); let o4 = myNew(Person2); console.log(o3); console.log(o4); //{test: "ttt"} //{test: "ttt"} o3.__proto__ === o4.__proto__;//true o3.__proto__ === Person2.prototype;//false o3.__proto__ === Object.prototype;//true
可以看到o3和o4都是建構函式返回的那個物件,與我們前面的描述是一致的。
關於new操作符相關的知識點,我理解的差不多就這麼多了, 歡迎大家在評論區補充。