通过前一节的学习,我们知道了如何创建一个自定义类,以及自定义实例。但是,目前为止,这个类的实例什么属性也没有,就像一个空object一样。
给一个对象添加属性
为了给类实例添加对象,我们可以像下面这样做:
function Position()
{
}
var pos = new Position()
pos.x=1 // 给pos对象添加x属性
pos.y=2 // 给y对象添加y属性
console.log(JSON.stringify(pos))
var pos2 = new Position()
console.log(JSON.stringify(pos2))
上在代码中,生成pos对象后,我们给pos对象添加了x,y属性,这样pos拥有了x,y坐标。但是我们并没有给pos2添加属性,pos2依旧是个空对象。
我们通过运行脚本来验证一下:
可以看到,脚本运行结果和我们预期一样。
给每一个对象添加属性
上面的做法显然是不可取的,因为每一个Position的实例都应当拥有x,y属性。为了达成这个目标,我们该怎么做呢?
这个时候构造函数就派上用场了。在JavaScript中,构造函数(constructor)就是函数本身,当新建一个实例的时候,构造函数会被调用。
下面通过一个例子来详细地了解构造函数:
function Position() // 这个函数就是构造函数
{
this.x=1 // 添加x属性
this.y=2 // 添加y属性
}
var pos = new Position()
console.log(JSON.stringify(pos))
var pos2 = new Position()
console.log(JSON.stringify(pos2))
仔细观察上述代码,可以看到我们在构造函数内添加了两行代码,分别为一个叫this的对象添加了x,y属性。
我们先来看一下脚本运行结果:
可以看到,现在pos、pos2两个对象都有了x,y属性。
解析构造函数
为了理解上面的代码为什么能为pos、pos2添加属性,我们了解两个东西。
首先,函数调用有两种模式:
- 普通函数模式。当函数被直接调用时,如func(),此时是普通函数,this指向的是全局对象
- 构造函数模式。当函数作为类型创建一个实例时而被调用时,如new func(),此时是构造函数,this对象被设置为新建的实例
其次,当执行 new Position() 的时候,JavaScript引擎做了两件事:
- 生成一个Position实例,如instance
- 以构造函数的形式执行Position函数
第2步的意思即是说,每一次创建新实例,函数都会以构造函数的模式被调用,而构造函数中的this被设置为指向每一次生成的实例。
所以在构造函数中的this设置属性,就是给每一个新创建的实例设置属性。
好了,这一节讲完了。你又学习到了更多关于JavaScript语言本质的特性。构造函数this对象是一个高频面试题,希望你能牢牢掌握。
什么是switch语句?
请继续关注我的课程,我将在后续课程中为大家解答上述问题。
想学计算机技术吗?需要1对1专业级导师指导吗?想要团队陪你一起进步吗?欢迎加我为好友!