创建对象的几种方式的优缺点对比

工厂模式

1
2
3
4
5
6
7
8
9
10
11
function createObj(name, gender){
var obj = new Object();
obj.name = name;
obj.gender = gender;
obj.sayName = function(){
alert(this.name);
}
return obj;
}
var person = createObj("Jack", "female");

缺点:

  • 无法无法确定对象的类型(因为都是Object)
  • 创建的多个对象之间没有关联。

构造函数模式

1
2
3
4
5
6
7
8
9
function createObj(name, gender){
this.name = name;
this.gender = gender;
this.sayName = function(){
alert(this.name);
}
}
var person = new createObj("Jack", "female");

缺点:

  • 多个实例重复创建方法,无法共享。
  • 多个实例都有sayName方法,但均不是同一个Function的实例。

原型方法

1
2
3
4
5
6
7
8
9
function createObj(){}
createObj.prototype.name = "Jack";
createObj.prototype.gender = "female";
createObj.prototype.sayName = function(){
alert(this.name);
}
var person = new createObj();

缺点:

  • 无法传入参数,不能初始化属性值。
  • 如果包含引用类型的值时,改变其中一个实例的值,则会在所有实例中体现。

组合式(构造函数+原型方法)推荐使用

1
2
3
4
5
6
7
8
9
10
11
function createObj(name, gender){
this.name = name;
this.gender = gender;
if(typeof this.sayName != 'function'){
createObj.prototype.sayName = function(){
alert(this.name);
}
}
}
var person = new createObj("Jack", "female");

说明:

if语句中只会调用一次,就是在碰到第一个实例调用方法时会执。此后所有实例都会共享该方法。在动态原型方法下,不能使用对象字面量重写原型。

寄生构造函数

寄生构造函数,其实就是工厂模式+构造函数模式,这种模式比较通用,但不能确定对象关系,所以,在可以使用之前所说的模式时,不建议使用此模式

在什么情况下使用寄生构造函数比较合适呢?假设要创建一个具有额外方法的引用类型,例如直接String.prototype.addstring,可以通过寄生构造的方式来添加.

1
2
3
4
5
6
7
8
9
function myString(string){
var str = new String(string);
str.addstring = function () {
return this + ",被添加了";
};
return str;
}
var box = new myString("lee");
alert(box.addstring());

稳妥构造函数

在一些安全环境中,比如禁止使用this和new,这里的this是构造函数里不使用this,这里的new
是在外部实例化构造函数时不使用new,这种创建方式叫做稳妥构造函数.

1
2
3
4
5
6
7
8
9
function A(name,age){
var obj = new Object();
obj.showName = function () {
return name;
};
return obj;
}
var a = A("Jack",18);
alert(a.showName());

本文结束,感谢阅读。

本文作者:melody0z
本文链接:https://melodyvoid.github.io/JavaScript/contrast-the-advantages-and-disadvantages-of-several-ways-of-creating-objects.html
欢迎转载,转载请注明文本链接

坚持原创技术分享,您的支持将鼓励我继续创作!