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>