在面向对象的类C语言如Java语言中,我们使用构造函数是实例化对象的过程,在JavaScript语言中我们可以使用构造函数的方式创建对象,如:
let obj = new LanguageFun("javaScript")
与面向对象的语言不同,JavaScript使用构造函数创建对象不是真正意义上的实例化,而是通过new操作符调用的构造函数。
构造函数的执行过程:
- 创建一个新的对象obj
- obj被执行原型链[[prototype]]连接
- obj绑定到函数调用的this上
- 没有其他返回对象,则返回obj
包括我们知道的内置函数Number(), String()都可以使用new操作符创建新的对象,这种函数在JavaScript中称为构造函数的调用。我们可以通过实例理解这个过程:
function LanguageFun(name){
this.name = name
this.sayHello = function(){
console.log("Hello , ",this.name)
}
}
let obj = new LanguageFun("javaScript")
obj.sayHello(); // Hello , javaScript
new LanguageFun()执行过程:
- 对象创建:创建一个全新的对象: let obj = new Object();
- [[prototype]]连接:obj.__proto__ = LanguageFun.prototype
- this绑定:this指向刚创建的obj对象
- 执行LanguageFun()函数
- 返回this对象
测试:
console.log(obj.__proto__ === LanguageFun.prototype); //true
兼容处理
当我们使用new操作符调用构造函数的时候没有问题,但是有时候我们会忘记使用new操作符,使用了普通函数的调用方式,产生异常,所以我们需要对JavaScript的构造函数进行兼容改造。
function LanguageFun(name){
if(!(this instanceof LanguageFun)) {
return new LanguageFun(name)
}
this.name = name
this.sayHello = function(){
console.log("Hello , ",this.name)
}
}
let obj1 = new LanguageFun("javaScript")
let obj2 = LanguageFun("javaScript")
obj1.sayHello(); // Hello , javaScript
obj2.sayHello(); // Hello , javaScript
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。