一、构造函数使用new命令执行过程
1.创建一个空对象,作为要返回的对象实例
2.将这个空对象的原型,指向构造函数的prototype属性
3.将这个空对象赋值给函数内部的关键字this
4.开始执行构造函数内部的代码
function Person(name, age) {
this.name = name
this.age = age
}
var p1 = new Person('张三', '20') //创建一个新的内存地址#p1
var p2 = new Person('李四', '18') //创建一个新的内存地址#p2 p1,p2都是Person的实例,创建#p1的时候,函数体内部的this指向#p1;创建#p2的时候,函数体内部的this指向#p2
二、构造函数的返回值
1.没有手动添加返回值的情况下,默认返回this
function Person1() {
this.name = '张三'
}
var p3 = new Person1()
console.log(p3.name) // '张三' 2.手动添加一个基本数据类型的返回值,返回的还是this
function Person2() {
this.age = 20
return 100
}
var p4 = new Person2()
console.log(p4.age) // 20 3.手动添加对象、数组等复杂数据类型的返回值,返回的是改复杂类型的值
function Person3() {
this.weight = '65KG'
return ['a', 'b', 'c']
}
var p5 = new Person3()
console.log(p5.weight) // undefined
console.log(p5) // ["a", "b", "c"]
function AnimalName() {
this.ani = 'dog'
return { newAni: 'cat' }
}
var p6 = new AnimalName()
console.log(p6.ani) // undefined
console.log(p6) // { newAni: 'cat' } 三、如果忘了使用new命令,直接调用构造函数会发生什么事?
function Func() {
this.text = '123'
}
var f = Func()
console.log(f) // undefined
console.log(text) // '123' 变量f变成了undefined,而text属性变成了全局变量 为了保证构造函数必须与new命令一起使用,可以在构造函数内部使用严格模式'use strict',也可以在构造函数内部判断是否使用了new命令
function Message(msg) {
'use strict'
this._msg = msg
}
Message() // Uncaught TypeError: Cannot set property '_msg' of undefined
function FooBar(foo, bar) {
if (!(this instanceof FooBar))
return new FooBar(foo, bar)
{}
this._foo = foo
this._bar = bar
}
console.log(FooBar('a', 'b')._foo) // a
console.log(new FooBar('a', 'b')._bar) // b