1.正常使用new
function Xue(name){
this.name = name
}
Xue.prototype.sayName = function(){
console.log(this.name)
}
var xue = new Xue('我是Xue')
Xue.sayName() // 我是Xue
xue.sayName() // 我是Xue
2.自己手写一个mynew
function Xue(name){
this.name = name
}
Xue.prototype.sayName = function(){
console.log(this.name)
}
// 上面是本身Xue
// ...args为ES6展开符,也可以使用arguments
function mynew(fn,...args){
//先用Object创建一个空的对象
//fn.prototype代表 用当前对象的原型去创建
// 或者可以用obj.__proto__ = Fu.prototype继承原型
const obj = Object.create(fn.prototype)
//现在obj就代表Xue了,但是参数和this指向没有修改
const rel = fn.apply(obj,args)
//正常规定,如何fn返回的是null或undefined(也就是不返回内容),我们返回的是obj,否则返回rel
return rel instanceof Object ? rel : obj
}
var xue = mynew(Xue,'这是用mynew出来Xue')
Xue。sayName() // 这是用mynew出来Xue
xue.sayName() // 这是用mynew出来Xue
3.总结new的具体步骤
1.创建一个空对象 var obj = {}
2.修改obj.proto=Fn.prototype
3.只改this指向并且把参数传递过去,call和apply都可以
4.根据规范,返回 null 和 undefined 不处理,依然返回obj