自定义构造函数的书写
1.一定是和 new 关键字连用,如果没有和 new 关键字连用,那么它就是一个普通函数
2.当一个函数和 new 关键字连用的时候, 这个函数就被称为自定义构造函数, 这个函数内的 this 指向, 指向返回出来对象
3.构造函数不能使用给箭头函数, 因为箭头函数内部没有 this
4.构造函数内部不需要 return
return 了基本数据类型, 写了和没写一样
return 了引用数据类型, 写了构造函数就没用了
5.书写构造函数时, 首字母建议大写.目的: 仅仅是为了和普通函数区分开
6.我们构造函数 通过 new 关键字 创建出来的对象, 叫做实例化对象, 本质上还是一个对象, 只不过名字上叫做实例化对象(实例对象)
我们把构造函数通过 new 关键字 创建对象的过程叫做 实例化
<script>
function createObj(num1, num2) {
// 此时 this === 将来被返回出去的对象
this.a = num1
this.b = num2
// return '我是 一个 普通字符串'
// return [1, 2, 3, 4, 5]
}
const o1 = new createObj(1, 2)
const o2 = new createObj(10, 20)
console.log(o1)
console.log(o2)
function Person() {
this.name = 'QF001'
}
const p1 = new Person()
</script>
<script>
const p1 = new Person()
new Person() //此时这个过程叫做 实例化, Person函数因为和new关键字连用, 我们叫做
自定义构造函数
//此时 常量 p1 我们叫做 实例化对象(实例对象)
</script>
构造函数的缺陷
1、构造函数最明显的缺点就是,每个方法都要在每个实例上重新创建一遍。
2、不是原型链继承,只是借用构造函数,所以不能继承原型的属性和方法。
3、虽然构造函数中定义的属性和方法是可以访问的,但是每个实例都被复制了。
<script>
// function Person (name, age) {
// this.name = name
// this.age = age
// this.fn = function () {
// console.log('AAAAAA')
// }
/**
* 这样写 实际功能也能完成, 但是多次创建对象时
* 会多次创建 功能代码完全相同一个函数
* 这对内存空间是一种浪费
*/
}
function fn() {
console.log('AAAAAA')
}
function Person(name, age) {
this.name = name
this.age = age
this.fn = fn
/**
* 这样写 实际功能也能完成, 并且在多次创建的时候
*
* 每次给 this.fn 赋值时, 都会去找到 fn 函数
*
* 然后多个对象的 this.fn 的引用地址 都是一个
*/
}
/**
* 通过 new 关键字 实例化 一个对象, 叫做 p1
*
* 函数内部执行时:
* 1. 将参数 name 赋值给 this.name
* 2. 将参数 age 赋值给 this.age
* 3. 创建一个函数(XF001) 赋值给 this.fn
*/
const p1 = new Person('QF001', 18)
/**
* 通过 new 关键字 实例化一个对象, 叫做 p2
*
* 函数内部执行时:
* 1. 将参数 name 赋值给 this.name
* 2. 将参数 age 赋值给 this.age
* 3. 创建一个函数(XF002) 赋值给 this.fn
*/
const p2 = new Person('QF002', 19)
console.log(p1)
console.log(p2)
p1.fn()
p2.fn()
console.log(p1.fn == p2.fn)
</script>