一文搞定js new发生了什么,new的作用是什么?

关于js的new,老东西了。言简意赅说下,其实它是继承的一种。

new发生了什么?

看下最官方的介绍:

var obj = {};
obj._ proto _= Base.prototype;
Base.call(obj);

小贴士:如果了解原型原型链、this绑定,上面这三行代码你已经读懂了。我建议先了解下。

把上面三行代码分别解读下:
1、声明一个空对象
2、把空对象的原型链 指向 Base原型(相当于obj继承了Base的方法,它可以使用Base里面的所有方法)
3、call绑定this指向。

就发生了这几个,完事。

new的作用是什么?

1、可以直接用原来函数内的方法(通过obj._ proto _= Base.prototype得知)。
2、可以直接把this绑定到原来函数内(通过Base.call(obj)得知)。

综上所述,它可以帮我们做这些事情,四个字:帮你继承。那么反过来验证假设,没有new语法这个东西,你自己就要做许多事情了。我们来验证下。

验证

1、不用new,试下赋值

function foo1(data){
  this.data = data
  this.getData = function (){
       console.log(data)
  }
}
//不用new,直接赋值看看能不能直接把foo1给foo3
var foo2 = foo1
foo2.data     //undefind
foo2.getData   //undefind

结论:根本不行,没继承。
2、用个new,实现继承。

function foo1(data){
  this.data = data
  this.getData = function (){
       console.log(data)
  }
}
var foo3 = new foo1('数据')
foo3  //   foo1 {data: "数据", getData: ƒ}
foo3.getData( )  // 数据

结论:此时用new可以得到foo1方法的内部属性,以及内部方法。而赋对比值明显不能继承foo1的东西。
3、不用new,自己写个继承
我们来自己写个new,假设没有new,但你想继承foo1,模拟一下。

//  同样的方法
function foo1(data){
  this.data = data
  this.getData = function (){
       console.log(data)
  }
}

// 模拟new
var foo4  = {}     
foo4.__proto__ = foo1.prototype
foo1.call(foo4,'数据4')
foo4   //  foo1 {data: "数据4", getData: ƒ}

结论:要多好几行代码,没有new来的方便,如上“多好几行代码”就是new 做的事情。

补充:可以发现,每次new继承后,你会发现返回了一个对象(比如foo3、foo4),所以请记住,new发生了什么还有一点:返回一个对象。

这就是new。

最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容