自用备忘笔记安全
前言函数
虽然可使用 Object 和对象字面量建立对象,可是若是要建立大量类似的对象又显得麻烦。为解决这个问题,人们开始使用工厂模式的变种。学习
工厂模式this
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);
优势:解决了建立多个类似对象的问题spa
缺点:没有解决对象识别的问题,即不知道生成对象是什么类型。prototype
构造函数模式设计
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);
优势:解决了对象识别的问题,经过对象能够知道它是由哪一个构造函数生成的。code
person1.constructor == Person //true person1 instanceof Person //true person1 instanceof Object //true
缺点:会在每一个实例对象上生成方法,没有达到复用的效果。对象
person1.sayName == person2.sayName; //false
经过 new 操做符会经历如下 4 个步骤:1. 建立一个新对象;2. 将构造函数的做用域赋给新对象;3. 执行构造函数中的代码;4. 返回新对象。blog
原型模式
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版)》