new 关键字的过程

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}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值