JS面向对象-创建对象
本篇主要是「JavaScript高级程序设计-面向对象的程序设计」一章中第二篇「创建对象」回顾的笔记
工厂模式
-
根据所接受的参数构建一个包含所有必要信息的对象。
-
示例
function createPerson(name, age, job) { var o = new Object(); o.name = name; o.age = age; o.job = job; o.sayName = function() { alert(this.name); } return o; } var person = createPerson('Matthew', 27, 'Software Engineer');
构造函数模式
-
特点:
- 没有显式地创建对象
- 直接将属性和方法赋给this对象
- 没有return语句
-
示例
function Person(name, age, obj) { this.name = name; this.age = age; this.job = job; this.sayName = function() { alert(this.name); } } var person = new Person('Matthew', 27, 'Software Engineer')
-
问题:
- 每个方法都要在每个示例上重新创建一遍
- 会导致不同的作用域链和标识符解析
原型模式
-
好处:
- 可以让所有对象实例共享它所包含的属性和方法
-
示例
function Person(){} Person.prototype.name = 'Matthew'; Person.prototype.age = 29; Person.prototype.job = 'Software Engineer'; Person.prototype.sayName = function() { alert(this.name); } var person = new Person(); person.sayName(); // 另一种 function Person(){} Person.prototype = { name: 'Matthew', age: 27, job: 'Software Engineer', sayName: function() { alert(this.name); } }
-
问题:
- 不方便
- 所有的属性都是共享的,不能隐藏属性
组合使用构造函数模式和原型模式
-
特点:
- 最常见的方式
- 每个实例都会有自己的一份实例属性的副本,同时又共享着对方法的引用,最大限度节省内存
- 支持构造函数传递参数
-
示例
function Person(name, age, job) { this.name = name; this.age = age; this.job = job; } Person.prototype = { constructor: Person, sayName: function() { alert(this.name); } } var person = new Person('Matthew', 27, 'Software Engineer');
动态原型模式
-
特点:
- 把所有信息封装在构造函数中,通过在构造函数中初始化原型,又保持了同时使用构造函数和原型的有点
-
示例
function Person(name, age, job) { // 属性 this.name = name; this.age = age; this.job = job; // 方法 if(typeof this.sayName != 'function') { Person.prototype.sayName = function() { alert(this.name); } } }
寄生构造函数模式
-
基本思想
- 创建一个函数,作用仅仅是封装创建对象的代码
- 再返回新创建的对象
-
示例
function Person(name, age, job) { var o = new Object(); o.name = name; o.age = age; o.job = job; o.sayName = function() { alert(this.name); } return o; }
稳妥构造函数模式
-
特点:
-
没有公共属性
-
适合在一些安全的环境中,或者在防止数据被其他应用程序改动时使用
-
-
示例:
function Person(name, age, job) { var o = new Object(); o.sayName = function() { alert(name); } return o; }