关于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。