Object-Oriented(一)创建对象
自用备忘笔记
前言
虽然可以使用 Object 和对象字面量创建对象,但是如果要创建大量相似的对象又显得麻烦。为解决这个问题,人们开始使用工厂模式的变种。
工厂模式
function person(name, age) { var o = new Object(); o.name = name; o.age = age; o.sayName = function() { alert(this.name); }; return o; } var person1 = person('Nicholas', 29), person2 = person('Greg', 27);
优点:解决了创建多个相似对象的问题
缺点:没有解决对象识别的问题,即不知道生成对象是什么类型。
构造函数模式
function Person(name, age) { this.name = name; this.age = age; this.sayName = function() { alert(this.name); }; } var person1 = new Person('Nicholas', 29), person2 = new Person('Greg', 27);
优点:解决了对象识别的问题,通过对象可以知道它是由哪个构造函数生成的。
person1.constructor == Person //true person1 instanceof Person //true person1 instanceof Object //true
缺点:会在每个实例对象上生成方法,没有达到复用的效果。
person1.sayName == person2.sayName; //false
通过 new 操作符会经历以下 4 个步骤:1. 创建一个新对象;2. 将构造函数的作用域赋给新对象;3. 执行构造函数中的代码;4. 返回新对象。
原型模式
function Person() {} Person.prototype.name = 'Nicholas'; Person.prototype.age = 29;
Person.prototype.friends = ['Shelby', Court]; Person.prototype.sayName = function() { alert(this.name); }; var person1 = new Person();
优点:原型对象上的属性和方法均可以复用。
缺点:引用类型属性被共享,无法传参数自定义实例对象的属性。
var person1 = new Person(), person2 = new Person(); person1.friends.push('Van'); console.log(person2.friends); //Shelby, Court, Van
组合模式
function Person(name, age) { this.name = name; this.age = age; } Person.prototype.sayName = function() { alert(this.name); }; var person1 = new Person('Nicholas', 29);
优点:集合了构造函数模式和原型模式的优点,是最广泛认可的模式。
缺点:构造函数和原型对象的初始化分开书写,对有类概念语言的学习者不友好。
动态原型模式
function Person(name, age) { this.name = name; this.age = age; if (typeof this.sayName == 'function') return; Person.prototype.sayName = function() { alert(this.name); } } var person1 = new Person('Nicholas', 29);
优点:将原型对象的初始化放入构造函数内部,是最理想的模式。通过检测(任一)方法是否存在,来避免重复对原型对象初始化。
寄生构造函数模式
function Person(name, age) { var o = new Object(); o.name = name; o.age = age; o.sayName = function() { alert(this.name); }; return o; } var person1 = new Person('Nicholas', 29);
缺点:与工厂模式相似,只是通过 new 操作符调用构造函数。与工厂模式一样,无法解决对象识别的问题,不推荐使用。
稳妥构造函数模式
稳妥对象是指没有公共属性,而且方法也不引用 this 的对象。
function Person(name, age) { var o = new Object(); o.sayName = function() { alert(name); }; return o; } var person1 = Person('Nicholas', 29);
优点:适用于禁止使用 this 和 new 的场景,安全性高,适合某些安全要求高的环节;属性未绑定在实例对象上,只能通过特点方法访问。
缺点:同样无法识别对象类型。
参考:《高级程序设计(第3版)》