工厂模式:


function createPerson(name, age) {

 var obj = {};

 obj.name = name;

 obj.age = age;

 obj.sayHello = function() {

   console.log("Hello, I'm " + this.name);

 };

 return obj;

}

var person = createPerson("John", 30);

 

构造函数模式:


function Person(name, age) {

 this.name = name;

 this.age = age;

 this.sayHello = function() {

   console.log("Hello, I'm " + this.name);

 };

}

var person = new Person("John", 30);

 

对象字面量(或称“对象直接量”):


var person = {

 name: "John",

 age: 30,

 sayHello: function() {

   console.log("Hello, I'm " + this.name);

 }

};

 

原型模式:


function Person() {}

Person.prototype.name = "John";

Person.prototype.age = 30;

Person.prototype.sayHello = function() {

 console.log("Hello, I'm " + this.name);

};

var person = new Person();

 

混合构造函数和原型模式(组合构造函数模式和原型模式的优点):


function Person(name, age) {

 this.name = name;

 this.age = age;

}

Person.prototype.sayHello = function() {

 console.log("Hello, I'm " + this.name);

};

var person = new Person("John", 30);

 

动态原型模式:


function Person(name, age) {

 this.name = name;

 this.age = age;

 

 if (typeof this.sayHello !== 'function') { // 只有当sayHello未定义时才添加

   Person.prototype.sayHello = function() {

     console.log("Hello, I'm " + this.name);

   };

 }

}

var person = new Person("John", 30);

 

寄生构造函数模式:


function createPerson(name, age) {

 var obj = new Object();

 obj.name = name;

 obj.age = age;

 obj.sayHello = function() {

   console.log("Hello, I'm " + this.name);

 };

 return obj;

}

var person = createPerson("John", 30);

 

稳妥构造函数模式(主要用于特殊情况,对象没有公共属性,只提供方法):


function Person(name, age) {

 var that = new Object();

 var privateName = name;

 var privateAge = age;


 that.getDetails = function() {

   return privateName + ", " + privateAge;

 };


 return that;

}

var person = Person("John", 30);

 

使用类来创建对象

随着ES6引入类(Class)语法,还可以使用类来创建对象,虽然在底层仍然是基于原型机制工作的:


class Person {

 constructor(name, age) {

   this.name = name;

   this.age = age;

 }


 sayHello() {

   console.log("Hello, I'm " + this.name);

 }

}

var person = new Person("John", 30);