1.对象字面量创建
let person1 = {
name: '张三',
age: 20,
getName: function () {
return this.name
},
}
2.通过 Object()来创建对象
let person = new Object()
person.name = '张三'
person.age = 20
person.getName = function () {
return this.name
}
console.log(person)
3.基于工厂方法
优点:解决多个相似对象而导致的代码重复问题 缺点:无法识别对象属于哪个类型
function createPerson(name, age) {
let person = new Object()
person.name = name
person.age = age
person.getName = function () {
return this.name
}
return person
}
let p1 = createPerson('张三', 20)
let p2 = createPerson('李四', 18)
console.log(p1);
console.log(p2)
4.通过构造函数创建对象
优点:解决了工厂模式无法识别对象类型 缺点:构造函数中的方法都要在实例上再次创建一遍
function Person(name, age) {
this.name = name
this.age = age
this.getName = function () {
return this.name
}
}
let p1 = new Person('张三', 20)
let p2 = new Person('李四', 18)
// console.log(p1, p2)
console.log(p1.constructor === p2.constructor)//true
console.log(p1 instanceof Object)//true
console.log(p2 instanceof Object)//true
console.log(p1.getName() === p2.getName()) //false
5.通过Prototype(原型)创建对象
优点:解决了上面构造函数中的方法都要在实例上重新创建的问题 缺点:在原型上定义的属性,被所有实例共享,所有的实例在该属性中都是相同的值
function Person() {
}
Person.prototype.name = '张三'
Person.prototype.age = 20
Person.prototype.getName = function () {
console.log(this.name);
}
let p1 = new Person()
let p2 = new Person()
p1.name// '张三'
p1.getName()//'张三'
p2.name// '张三'
p2.getName()//'张三'
console.log(p1.getName() === p2.getName()) //true