1 <script> 2 function Person(name, age) { 3 this.name = name 4 this.age = age 5 console.log(this) 6 } 7 Person.prototype.have = 'cat' 8 const person = new Person('zhangsan', '20') 9 console.log(person.name) 10 console.log(person.age) 11 console.log(person.have) 12 </script>
從這個例子中,可以看到new具有以下能力:
1.new創建出來的實例可以訪問構造函數Person的屬性
2.new創建出來的實例可以訪問構造函數原型上的屬性
3.new可以將構造函數中的this綁定到新創建出來的對象person上
無返回值的new實現:
1 <script> 2 function Person(name, age) { 3 this.name = name 4 this.age = age 5 console.log(this) 6 } 7 Person.prototype.have = 'cat' 8 function fakenews(Fn) { 9 // 創建一個空對象 10 let obj = new Object() 11 // 將新對象的原型指針指向構造函數的原型 12 obj.__proto__ = Fn.prototype 13 // 處理除了Fn以外的參數 14 // [].slice:返回數組中的一段,在這里是返回arguments數組第一個數以后的所有數 15 // 將[].slice看作Fn,這里其實就是將[].slice的指向改為arguments 16 Fn.apply(obj, [].slice.call(arguments, 1)) 17 return obj 18 } 19 const person = fakenews(Person, "張三", "20") 20 console.log(person.name) 21 console.log(person.age) 22 console.log(person.have) 23 </script>