对象创建
工厂化方法创建对象
- 目的:批量创建对象,减少重复代码
- 缺点:
- 无法读取出对象所属类型,均为Object类型
- 函数重复、浪费资源
示例:
function createPerson(params) {
var obj = new Object()
obj.name=params.name
obj.age=params.age
obj.gender=params.gender
obj.sayName=function (){
console.log(this.name)
}
return obj
}
var obj1 = createPerson({
name:'沙僧',
age:800,
gender:'男'
})
console.log(obj1)
//结果:{name: '沙僧', age: 800, gender: '男', sayName: ƒ}
obj1.sayName()
//结果:沙僧
构造函数
-
构造函数就是一个普通函数,创建方式与普通函数相同
-
构造函数默认首字母大写
-
调用区别
- 普通函数:直接调用
- 构造函数:使用关键字进行调用
-
执行流程
-
调用构造函数会立刻创建一个新的对象
-
将新建的对象设置为函数中的this,在构造函数中可使用this来引用新建的对象
-
逐行执行函数中的代码
-
将新建的对象作为返回值返回
-
示例:
function Person(params) { this.name = params.name this.age = params.age this.gender = params.gender this.sayName = function () { console.log(this.name) } } var person = new Person({ name: '沙僧', age: 500, gender: '男' }) console.log(person) // 结果:Person {name: '沙僧', age: 500, gender: '男', sayName: ƒ} person.sayName() // 结果:沙僧
-
-
使用同一个构造函数创建的对象称为同类对象,也将一个构造函数称为类
-
将通过一个构造函数创造的对象称为该类(构造函数)的实例
-
所有对象均为Object的后代
-
使用instanceof可检查某一实例是否属于某一类
- 该方法返回值为boolean类型
- 任何对象使用该方法检查是否属于Object类时,结果均为true
console.log(person instanceof Person) // 结果:true
优化
优化前
-
方法在构造函数内部创建
- 构造函数没执行一次即创建一个新的方法
- 所有实例的方法都是唯一的
- 新的方法都相同,内存空间占用严重
优化后
-
目的:减少内存占用,提升性能
-
实现
-
将目标方法在全局作用域中定义
function fn(){ console.log(this.name) }
-
将方法赋值给实例
function Person(params) { this.name = params.name this.age = params.age this.gender = params.gender this.sayName = fn }
-