js面向对象程序设计——几种创建对象的方式
刚好最近有笔试题说说js几种创建对象的模式,便写一写,理一理
创建对象
1 对象字面量
var obj = {
hour: 12,
day: 13,
getTime: function(){
console.log(new Date());
}
}
2 创建Object实例
var obj = new Object();
obj.hour = 10;
对象创建模式
1.工厂模式
- 概念:工厂模式是软件工程领域一种广为人知的设计模式,这种模式,抽象了具体的创建过程。
- 优点:解决了创建多个相似对象的问题
- 缺点:没有解决对象的识别问题
- 实现
function createPerson(name, age, job){
var o = new Object();
o.name = name;
o.age = age;
o.job = job;
o.sayName = function(){
console.log(this.name);
}
return o;
}
2.构造函数模式
- 与createPerson对比:
- 1.没有显式地创建对象;
- 2.直接将属性和方法赋值给this对象;
- 3.没有return语句。
- 要创建Person的新实例,使用new操作符实际会发生以下四个步骤
- 创建一个对象
- 将构造函数的作用域赋值给新的对象(因此this就指向了这个新对象)
- 执行构造函数中的代码
- 返回新对象
- 对象的识别,使用instanceof
- 优点:创建自定义的构造函数对象意味着未来可以将它的实例标识为一种特定的类型。
- 缺点:每个方法都要在每个实例上重新创建一遍,即personal1和persoanal2都有一个名为sayName()的方法,但那两个方法不是同一个Function的实例,虽然可以使用定义全局方法例如
function Personal(name, age, job){
this.sayName = sayName;
}
function sayName(){
cossole.log(this.name);
}
这样虽然可以解决上面的问题,可是当方法越来越多就会显得很混乱而且丝毫没有封装性可言。
- 实现:
function Person(name, age, job){
this.name = name;
this.age = age;
this.job = job;
this.sayName = function(){
console.log(this.name);
}
}
var person1 = new Person('555', 55, '666');
var person1 = new Person('666', 66, '555');
3 原型模式
- 实现的根据:每个函数都有一个prototype属性,这个属性时一个指针,指向一个对象,对象都具有可扩展属性。
- 实现:
function Perosn(){
}
Perosn.prototype.name = 'mark';
Perosn.prototype.age = 29;
Perosn.prototype.job = 'enlish';
Perosn.prototype.sayName = function(){
console.log(this.name);
}
- 理解:理解原型对象,可以查看我以前的内容
- 优点:解决了上面定义多个方法的问题,让多个对象的方法指向同一个Function实例
- 缺点:对象没有自己的属性,每次改动原型模式中的属性,其他对象额属性也会跟着改变
4 组合使用构造函数模式和原型模式
- 比较容易理解,就是将构造函数和原型模式结合起来,构造函数有自己的属性,使用原型扩展公用方法
- 实现
function Person(name. age, job){
this.name = name;
this.age = age;
this.job = job;
this.friends = ['Geroy', 'Scout'];
}
Person.prototype = {
constructor: Person,
sayName: function(){
console,log(name);
}
}