1 new Object
let obj = new Object()
obj.name = 'zs'
obj.age = 20
obj.sayHI = function () {
console.log('hello');
}
console.log(obj)// {name: "zs", age: 20, sayHI: ƒ}
2 对象字面量
let obj2 = {
name: 'ls',
age: 21,
sayHI: function () {
console.log('hello');
}
}
console.log(obj2);//{name: "ls", age: 21, sayHI: ƒ}
3 工厂函数
function creatObj(name, age) {
let obj = {
name: name,
age: age,
sayHi: function () {
console.log('hello')
}
}
return obj
}
let obj3 = creatObj('ww', 22)
console.log(obj3);// {name: "ww", age: 22, sayHi: ƒ}
let obj4 = creatObj('zl', 23)
console.log(obj4);// {name: "zl", age: 23, sayHi: ƒ}
构造函数的缺点是无法区分对象类型
4构造函数
function Person(name, age) {
this.name = name
this.age = age
this.sayHi = function () {
console.log(this);
}
}
let p = new Person('tq', 24)
console.log(p) // Person {name: "tq", age: 24, sayHi: ƒ}
构造函数的缺点是每new一个实例,都要给所有成员分配存储空间,造成空间浪费
console.log(p1.sayHi === p2.sayHi) //false
解决方案是将方法提出来,但提出来又会造成全局污染,于是用另一个对象包起来
let obj = {
sayHi: function () {
console.log('hello');
},
running: function () {
console.log('running');
}
}
function Person(name, age) {
this.name = name
this.age = age
this.sayHi = obj.sayHi
this.running = obj.running
}
console.log(p1.sayHi === p2.sayHi) //true
所以使用原型保存构造函数的方法