一,创建对象
1. 对象字面量,Object构造函数
- 缺点:无法创建多个属性类似的对象
let person = {
name: '小明',
age: 18,
getName() {
return this.name
}
}
let obj = new Object()
obj.name = '小红'
obj.age = 18
obj.getName = function() {
return this.name
}
2. 工厂模式
- 缺点:无法标识自定义对象的类型,都是Object类型
function createPerson(name, age, job) {
let o = new Object()
o.name = name
o.age = age
o.job = job
o.sayName = function() {
console.log(this.name)
};
return o;
}
let person1 = createPerson("Nicholas", 29, "Software Engineer")
let person2 = createPerson("Greg", 27, "Doctor")
3. 构造函数模式
- 优点: 可以复用,可以标识自定义对象的类型
- 缺点: 构造函数中的方法会在每个实力上都创建一遍,无法复用构造函数中的方法,浪费内存
// 可以通过instanceof 标识自定义对象的类型 但是其定义的方法会在每个实例上都创建一遍
function Person(name,age) {
this.name = name
this.age = age
this.getName = function() {
return this.name
}
}
let p = new Person('xiaoming',18)
let name = p.getName()
通过new 调用对象创建实例化对象会进行如下操作
- 在内存中创建一个新对象
- 这个新对象内部的
[[prototype]]属性被赋值为构造函数的prototype属性 - 构造函数内部的
this被赋值为这个新对象(即this指向新对象) - 执行构造函数的内部代码(给对象添加属性)
- 如果构造函数返回非空对象,则返回这个对象,否则返回刚创建的对象
4.原型模式
- 优点:实例的方法和属性可以实现复用
- 缺点:
- 无法向构造函数传递参数
- 属性和方法在各个实力间共享(最理想的是方法共享,属性私有)
function Person() {}
Person.prototype.name = 'xiaoming'
Person.prototype.age = 18
Person.prototype.getName = function() {
return this.name
}
let person1 = new Person()
- 原型:构造函数 原型对象 实例 是三个完全不同的对象
function Person() {}
console.log(Person.prototype)
// 构造函数有一个prototype属性
// 引用其原型对象,而这个原型对象也有一个属性constructor属性,引用这个构造函数
console.log(Person.prototype.constructor === Person) // true
// 正常的原型链都会终止于Object的原型对象
// Object的原型的原型是null
console.log(Person.prototyep.__proto__.__proto__) // null
- 实例通过
__proto__链接到原型对象,构造函数通过prototype链接到原型对象,实例和构造函数没有直接联系,实例与原型对象有直接联系
5.组合使用构造函数和原型模式
- 优点:方法可以实现复用,属性可以有私有属性
- 缺点:无
function Person(name,age) {
this.name = name;
this.age = 18
this.friends = ['Jack','Kobe']
}
Person.prototype = {
constructor: Person,
sayName: function() {
console.log(this.name)
}
}
let obj1 = new Person('小明')
obj1.friends.push('小红') // ['Jack','Kobe','小红']
obj1.getName() // 小明
let obj2 = new Person('小张')
obj2.friends.push('小李') // ['Jack','Kobe','小李']
obj2.getName() // 小李
6.通过Object.create() 创建对象
let obj = Object.create(null)
obj.name = 'xiexk'
obj.age = 18
7. class 创建对象
class Person {
constructor(name,age) {
this.name = name;
this.age = age;
this.getName = function () {
return this.name;
}
}
getAge() {
return this.age;
}
}
let obj = new Person('xiexk',18)