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 }

大侦探阿毛
21 声望0 粉丝