工厂模式:
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);