四.JavaScript——构造函数constructor、ne
2019-08-26 本文已影响0人
陈程城
构造函数constructor
Java/c++
基于类
JavaScript
基于原型
es6
引入的 class
关键字,只是语法糖
JavaScript
只有一种结构:对象
。
所谓"构造函数constructor"
,就是专门用来生成实例对象的函数。就相当于是一个模板。一个构造函数可以生成多个实例对象,并且,这些实例对象都有着相同的结构
var Test = function(){
this.name = "构造函数事例"
}
其实构造函数就是一个普通的函数;为了区分于普通函数,一般情况,构造函数都是以大写
字母开头,例如Object
,Array
,Boolean
,String
,Number
,Date
,Blob
...
构造函数特点
- 函数内部使用了
this
关键字,指向了要生成实例对象 - 通过
new
命令,创建一个对象
new关键字
用于调用构造函数,生成实例对象
var Test = function(){
this.name = "构造函数事例"
}
// 不推荐写法
// var testObject = new Test
// 推荐写法
var testObject = new Test()
console.log(testObject)
//Test {name: "构造函数事例"}
new
本身就是执行了函数,所以可以带()
,也可以不带
传参
var Test = function(name){
this.name = name
}
var testObject = new Test("构造函数事例2")
console.log(testObject)
//Test {name: "构造函数事例2"}
特殊情况---不使用new
时
var Test = function(name){
this.name = name
}
var testObject = Test("构造函数事例2")
console.log(testObject)
// undefined
此时,函数Test
只是一个普通函数,this
指向全局window
,函数Test
并没有返回什么,所以打印出了undefined
解决办法
- 使用严格模式
use strict
var Test = function(name){
'use strict';
this.name = name
}
var testObject = Test("构造函数事例2")
console.log(testObject)
// Uncaught TypeError: Cannot set property 'name' of undefined
使用严格模式后,作为普通函数调用,this
不会指向全局,默认为undefined
,所以会报错
- 使用
instanceof关键字
,判断this
对象的任何位置是否出现构造函数的prototype
var Test = function(name){
if(!(this instanceof Test)){
return new Test(name)
}
this.name = name
}
var testObject = Test("构造函数事例2")
console.log(testObject)
// Test {name: "构造函数事例2"}
判断判断this
对象的任何位置是否出现构造函数的prototype
,若否,则返回一个实例对象