1、字面量方式
let obj1 = {name:'小明',age:18};
2、new
let obj2 = new Object();
obj2.name = '小明';
obj2.age = 18;
3、Object.create()
let tempObejct = {sex:'女'};
let obj3 = Object.create(tempObejct,{
name:{
value: '小明',
writeable: true,
configurable: true,
enumerable: true
},
age:{
value: 18,
writeable: true,
configurable: true,
enumerable: true
}
});
console.log(obj3); // { name: '小明' }
console.log(obj3.sex); // '女'
Object.create() 第一个参数是放在新对象的原型上的。第二个传参可选,是放在新对象的实例上的,但是需要以属性描述对象的形式来描述。
当用构造函数new Object()或对象字面量方法创建空对象时,对象时有原型属性的,即有proto。
当用Object.create()方法创建空对象时,对象是没有原型属性的。
4、构造函数模式
function Person4(name,age){
this.name = name;
this.age = age;
this.sleep = function(){
console.log(this.name + 'sleep')
}
}
let obj4 = new Person4('小明',18);
console.log(obj4); // Person { name: '小明', age: 18 }
obj4.sleep(); // 小明sleep
优点:各个实例的引用类型互相隔离
缺点:每创建一个新对象(实例),方法都要重新构造一遍,费时间费内存
5、原型模式
function Person5(name,age,sleepTime){
Person5.prototype.name = name;
Person5.prototype.age = age;
Person5.prototype.sleepTime = {
time:sleepTime
};
Person5.prototype.sleep = function(){
console.log(name + 'sleep');
}
};
let obj51 = new Person5('小明',18,1);
console.log(obj51); // Person5 {}
obj51.sex = '女';
console.log(obj51); // Person5 { sex: '女' }
obj51.sleep(); // 小明sleep
let obj52 = new Person5('小红',18,2);
console.log(obj51.sleepTime); // { time: 2 }
console.log(obj52.sleepTime); // { time: 2 }
优点:方法共享
缺点:每创建对象(实例),之间的引用类型会互相污染
6、混合模式(构造函数模式 + 原型模式)
鉴于上面两种模式是互补的,可以用构造函数模式声明实例属性(基本类型和引用类型都可以),而原型模式用于定义方法和共享属性
function Person6(name,age,sex,sleepTime){
this.name = name;
this.age = age;
this.sleepTime = {
time:sleepTime
}
Person6.prototype.sleep = function(){
console.log(name + 'sleep');
}
}
let obj61 = new Person6('小明',18,'女',1);
console.log(obj61); // Person6 { name: '小明', age: 18, sleepTime: { time: 1 } }
obj61.sleep(); // 小明sleep
let obj62 = new Person6('小红',18,'女',2);
console.log(obj61.sleepTime); // { time: 1 }
console.log(obj62.sleepTime); // { time: 2 }
7、工厂模式
就是将创建对象的流程包装起来,便于大批量创造实例对象
function Person7(name,age){
var obj = new Object();
obj.name = name
obj.age = age
return obj
}
let obj71 = new Person7('小明',18);
let obj72 = new Person7('小红',18);
console.log(obj71); // { name: '小明', age: 18 }
console.log(obj72); // { name: '小红', age: 18 }
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。