| 自定义 JavaScript 对象的方式
2019-08-04 本文已影响0人
Hemingway_AT
JavaScript的数据类型分为简单类型和复杂类型,作为复杂类型的对象是业务代码的基础。本篇介绍定义JS对象的方式,比较全了。目录如下:
- 直接实例模式
- 构造函数模式
- 原型模式
- 组合模式(构造函数模式&原型模式)
- 动态原型模式
- 工厂模式
一、直接实例模式
- 使用字面量
var p = {
name: 'Mary',
age: 18,
desc: function(){
document.write(this.name + ' is ' + this.age);
}
};
p.desc();// Mary is 18
- 使用Object内置对象
var p = new Object();
p.name = 'Mary';
p.age = 20;
p.desc = function(){
document.write(this.name + ' is ' + this.age);
};
p.desc();// Mary is 20
通过new创建的实例,支持增添键值对,完善属性定义。
二、构造函数模式
function Person(name, age){
this.name = name;
this.age = age;
this.desc = function(){
document.write(this.name + ' is ' + this.age);
};
}
var p = new Person('Mary', 22);
p.desc();// Mary is 22
var p2 = new Person('Peter', 18);
p2.desc();// Peter is 18
通过传参,可初始化差异性的实例。然而,每一个实例是独特的;每创建一个Person实例,就会创建一个desc方法,而这个一致的方法并不需要重复创建。
三、原型模式
function Person(){
}// 构造函数
Person.prototype.name = 'Mary';
Person.prototype.age = 24;
Person.prototype.desc = function(){
document.write(this.name + ' is ' + this.age);
};
var p = new Person();
p.desc();// Mary is 24
var p2 = new Person();
p2.desc();// Mary is 24
代码效率高,但是原型中的属性被所有实例共享,意味着所创建出来的对象千篇一律。
四、组合模式(构造函数模式&原型模式)
function Person(name, age){
this.name = name;
this.age = age;
}// 构造函数
Person.prototype.desc = function(){
document.write(this.name + ' is ' + this.age);
};
var p = new Person('Mary', 26);
p.desc();// Mary is 26
var p2 = new Person('Peter', 20);
p2.desc();// Peter is 20
组合模式,继承了单一构造函数和原型模式的优点:构造函数灵活初始化实例属性,原型则用来定义公共方法。
五、动态原型模式
function Person(name, age){
this.name = name;
this.age = age;
if(! Person.prototype.desc){// 为了使desc函数不重复定义
Person.prototype.desc = function(){
document.write(this.name + ' is ' + this.age);
};
}
}
var p = new Person('Mary', 28);
p.desc();// Mary is 28
构造函数模式和原型模式的另一种组合形式,即在构造函数中初始化原型。这种把所有信息都封装在了构造函数中的写法,是不是和其他面向对象语言(如Java)的写法更像呢!
六、工厂模式
function createPerson(name, age){
var p = new Object();
p.name = name;
p.age = age;
p.desc = function(){
document.write(this.name + ' is ' + this.age);
};
return p;
}
var p = createPerson('Mary', 30);
p.desc();// Mary is 30
对外屏蔽对象实例化过程。通过传参,在工厂方法里面,显示地创建对象并实例化返回。
(完)