javascript构造函数的作用(构造函数的八种方法)
程序员文章站
2023-11-21 08:03:28
由于javascript的特性,一个构造函数就可以实现类的功能,所以有的时候,我们定义一个类,往往可以直接写一个构造函数:function cup(cupcover, cupbody, cupbott...
由于javascript的特性,一个构造函数就可以实现类的功能,所以有的时候,我们定义一个类,往往可以直接写一个构造函数:
function cup(cupcover, cupbody, cupbottom) {
this.cupcover = cupcover
this.cupbody = cupbody
this.cupbottom = cupbottom
}
复制代码
这样的定义方式很灵活简单,但有时候实例化出错了,也不会有相应的提示。
比如我们这样的实例化:
let cup = cup('iron', 'plastic', 'rubber')
复制代码
当我们没有加上new的时候,编译器并不会提示(弱类型的特点),而且由于cup本身就是一个函数,所以在使用的时候,也可以正常运行。
但是当我们cup此时肯定不是cup类的,显而易见,当我们把cup当作一个函数执行的时候,cup的值取决于函数的返回。这里没有返回,所以是undefined。
那么我们执行完这个cup()函数后,造成了什么影响呢?答案是cup的属性绑定到了全局变量上。对于浏览器来说就是window
cup.cupcover // undefined
window.cupcover // "iron"
复制代码
所以,我们该如何避免这种情况发生呢?
我们可以稍稍改造一下cup构造函数:
function cup(cupcover, cupbody, cupbottom) {
if(this instanceof cup) {
this.cupcover = cupcover
this.cupbody = cupbody
this.cupbottom = cupbottom
}
else {
return new cup()
}
}
复制代码
这样当我们再次不小心执行let cup = cup(‘iron’, ‘plastic’, ‘rubber’)时,由于此时的this并不是cup的派生类,所以我们直接返回一个实例。
let cup = cup('iron', 'plastic', 'rubber')
cup.cupcover // "iron"
复制代码
而这种形式的构造函数,就是今天要说的安全模式的构造函数。