js基础知识——面向对象
一、面向对象是什么?
- 他并不是一个语法, 也并不是一个新的语言, 他是用 JS 完成需求 的一种思想
二、创建对象的方式
- 需要能够方便我们批量创建对象
1.字面量的方式
//这个方式不合适, 不利于批量创建
let obj = {
name: 'QF001',
age: 18
}
2.内置构造函数
//这个方式不合适, 不利于批量创建
let obj = new Object()
3.工厂函数
function createObj(num) {
// 3.1 手动创建一个对象
const obj = {}
// 3.2 手动给对象上添加一些属性
obj.name = 'QF001' // 添加一个 固定的字符串, 每次创建对象他的属性都是 ''QF001
obj.age = num // 利用形参给对象的属性赋值一个 '变量', 这样每次创建对象时都可以修改这个属性的值
// 3.3 手动给对象返回
return obj
}
let obj1 = createObj(18)
let obj2 = createObj(66)
console.log(obj1)
console.log(obj2)
4.自定义构造函数的方式
- 什么是构造函数?
- 本质上就是一个普通函数, 如果再调用的时候, 前边加上一个关键字 new, 那么我们把这种函数叫做 构造函数。
function Person (name,age){
// 因为构造函数自动创建出来的的对象可以通过this来访问,所以 当需要向这个对象添加属性时,可以通过this添加
this.age = age
this.name = name
this.a = '固定属性内容'
}
const p1 = new Person(20,'jack')
const p2 = new Person(100,'als')
console.log(p1)
console.log(p2)
- 构造函数有什么注意点?
- 构造函数的函数名首字母 大写 (建议, 非强制), 目的就是为了和普通函数做一个区分
- 构造函数内 不要写 return
- 如果 return 的是一个 基本数据类型, 写了也没用
- 如果 return 的是一个 引用数据类型, 写了就会导致构造函数没用
- 构造函数调用时, 必须和 new 关键字连用
- 如果不连用, 也能调用, 但是构造函数就没用了
- 构造函数内部的 this
- 当一个函数 和 new 关键字连用的时候, 那么我们说这个函数是 构造函数,然后这个函数内部的 this 指向本次调用被自动创建出来的那个对象
- 构造函数不能使用 箭头函数
- 因为箭头函数内部没有 this
- 构造函数的缺点?
- 构造函数内部 如果有这个引用数据类型, 比如函数
- 在多次调用构造函数时, 每一次都会重新创建一个函数, 必然会造成这个内存空间的浪费
- js 内的数据结构类
- 在 JS 中, 任何一个数组, 他的构造函数都是 Array
- 在 JS 中, 任何一个对象, 他的构造函数都是 Object