js如何手寫一個new


手寫new

看一下正常使用new

function Dog(name){
    this.name = name
}
Dog.prototype.sayName = function(){
    console.log(this.name)
}
var dog = new Dog('小狗')
dog.sayName()

結果為小狗

自己手寫的new

function Dog(name){
    this.name = name
}
Dog.prototype.sayName = function(){
    console.log(this.name)
}
// 上面是本身Dog
function _new(fn,...args){   // ...args為ES6展開符,也可以使用arguments
    //先用Object創建一個空的對象,
    const obj = Object.create(fn.prototype)  //fn.prototype代表 用當前對象的原型去創建
    //現在obj就代表Dog了,但是參數和this指向沒有修改
    const rel = fn.apply(obj,args)
    //正常規定,如何fn返回的是null或undefined(也就是不返回內容),我們返回的是obj,否則返回rel
    return rel instanceof Object ? rel : obj
}
var _newDog = _new(Dog,'這是用_new出來的小狗')
_newDog.sayName()

結果為這是用_new出來的小狗

總結一下

new相當於上面的哪些代碼呢?

new的具體步驟

  1. 創建一個空對象 var obj = {}
  2. 修改obj.__proto__=Dog.prototype
  3. 只改this指向並且把參數傳遞過去,call和apply都可以
  4. 根據規范,返回 null 和 undefined 不處理,依然返回obj


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM