模拟js的new运算符的实现原理
我们知道,js里有一种创建对象的方式是通过显式的构造函数new出来一个实例化对象
但是 这个new运算符是怎么实现的呢?
先捋一遍new运算符的整个流程:
1: 创建一个新对象 它继承自构造函数的prototype
2:构造函数被执行 执行的时候 相应的传参会被传入,同时绑定上下文(this)
3:如果构造函数返回了一个'对象' 那么这个对象会取代整个new出来的结果。如果构造函数
没有返回对象,那么new出来的结果为步骤1创建的新对象
<script>
function Tiger(){
this.name='泰哥';
this.work='eat meat';
}
Tiger.prototype.tiger_dance = function(){
console.log('dancing~~~~~~!');
}
var tigers = new Tiger();
console.log(tigers);
</script>
![图片描述][1]
接下来就手动实现一个new运算符:
<script>
var new2 = function(func){
//创建一个空对象 并继承构造函数的原型对象
var o = Object.create(func.prototype);
//执行构造函数func 并改变func的this为o对象的
var k = func.call(o);
//判断构造函数func执行完的结果是不是对象类型
if(typeof k === 'object'){
return k;
}else{
return o;
}
}
function Funky(){
this.name='泰哥';
this.work='eat meat';
}
Funky.prototype.funky_dance = function(){
console.log('dancing~~~~~~!');
}
var funkys = new2(Funky);
console.log(funkys);
</script>
![图片描述][2]
可以看到 Funky的实例化对象funkys 已经有了构造函数Funky本身的属性并且也继承了Funky原型链上的方法
并且 funkys.__proto__ === Funky.prototype
至此,我们已经简单的实现了new运算的功能 是不是蛮简单~
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。