new关键字可以制造出一个对象。
一个简单的例子:
function A(){
}
var b = new A();
此时的b就是一个由函数A制造出来的对象了。
它继承了A的原型
new关键字帮我们干了点什么呢?
function A(){
首先,系统会帮我们创建一个this空对象。
var this = {}
将函数A的原型挂到this这个对象上
this = A.prototype;
将这个对象返回出去,此时它的操作就相当于闭包了
return this;
}
以上的三个步骤是系统帮我们完成的,并非我们自己操作的。
是以,若是作为构造对象使用,它的默认返回值是对象。
但其实这个返回值是可以被我们人为更改的。
当你给它添加的返回值是引用类型的数据,那么new关键字的功能就失效了。
此时,它写或不写,它都是闭包的作用了。
下面这个例子模拟了一下它的功能
var obj = {}
function A(){
}
obj = A.prototype
console.log(obj)
当然,这里还要修改函数A中的this指向,以及解决闭包的赋值问题。
我们都知道:
对象直接赋值是浅克隆,它的this指向没有做任何改变。
new关键字返回出来的对象一定是改变了返回出来的对象的this指向,
或者说对返回出来的对象进行深度克隆了。
补充一点:
this指向和系统帮我们定义的空对象this不是一回事。
来看一个它相当于闭包的例子,大家可以多去试试:
function A(){
return []
}
var b = A()
console.log(b);//[]
以下这个例子也证实了这个问题。
function A(){
this.b = 1;
return {}
}
var c = new A();
console.log(c.b)//undefined
关于new关键字制作出来的对象,有以下几点:
1.同一个构造函数使用new关键字制造出来的对象互不干扰。
举个例子:
function A() {
}
var b = new A()
b.abc = 1;
console.log(b) //{abc:1}
var c = new A();
console.log(c) //{}
2.当构造函数改变时,由它制造出来的所有对象都会改变。
function A() {
this.num = 1;
}
var b = new A()
b.abc = 1;
console.log(b) //{num: 1, abc: 1}
var c = new A();
console.log(c) //{num: 1}