我们经常用来创建对象的方式有如下几种:

一:对象字面量或者object构造函数

var person ={ }

var person = new Object()

这两个都可以用来创建单个对象,但存在一个问题,当用作一个接口来创建很多类似的对象时,会产生大量的重复代码,于是有了下面的方式;

二:工厂模式

function createPerson(name,sex,age) {
  var  o=new Object();
  o.name=name;
  o.sex=sex;
  o.age=age;
  o.sayName=function(){
    alert(this.name);
  }
  return o;
}

var person1=createPerson("lilei”,"男",18);

工厂模式虽然解决了创建多个类似对象代码重复的问题,但是它也存在一个问题,无法判断这个对象的类型(只知道是object对象),于是有了下面的方式;

三:构造函数模式

function Person (name,age,sex) {
  this.name=name;
  this.age=age;
  this.sex=sex;
  this.sayName=function(){
    alert(this.name);
  };
}

var person1=new Person("lilei",18,"男");
var person2=new Person("xiaomei",18,"女");

 (若有人不懂构造函数,请自行搜索补充构造函数的相关知识点喔)

alert(person1 instanceof Person) true
alert(person1 instanceof Object) true

 创建自定义构造函数就意味着将来可以将实例标记为特定的类型,这正是胜过工厂模式的地方;但是它也存在一个问题,每次new实例的时候,

构造函数中的属性都会重新创建一遍,也就意味着person1和person2中具有相同功能的sayName函数其实是两个不同的函数,如下验证:

alert(person1.sayName==person2.sayName)  false

实现相同的功能,却要实例化两次,占用两个不同的内存,这就是构造函数存在的问题,于是,有了下面的方式;

四:原型模式(若对原型还不太理解,请看我关于原型的文章http://www.cnblogs.com/lichunyan/p/8372235.html )

function Person () {

}
Person.prototype.name="lilei";
Person.prototype.sex="男";
Person.prototype.age="18";
Person.prototype.sayName=function (){
  alert(this.name);
}

var person1=new Person();
var person2=new Person();
person1.sayName(); ---"lilei"
person2.sayName();  ---"lilei"

alert( person1.sayName() == person2.sayName());  true

 WOO~,所有实例共享了构造函数所有的属性及方法,貌似很完美了,但是,机智的你有没有发现什么不完美的地方呢?我来告诉你:

1.所有实例都共享构造函数的属性,所以,每个实例取到的都是相同的值,且不能传参修改;

2.最大的问题是由于共享引起的,其中一个实例修改了属性,则所有实例都会被动修改;

person1.name="hanmeimei";
alert(person2.name);   ---"hanmeimei"

如果我们要的就是所有实例有相同的值,那这样正好,但是,如果想让每个实例的属性各不同且互不影响,那问题就来了,于是,有了下面的模式;

五:组合使用构造函数和原型模式

function  Person (name,age){
  this.name=name;
  this.age=age;
}
Person.prototype.sayName=function(){
  alert(this.name);
}

var person1=new Person("lilei","18");
var person2=new Person("hanmeimei","18");

person1.sayName();  ---"lilei";
person2.sayName();  ---"hanmeimei";

person1.age=17;

alert(person1.age); ---17
alert(person2.age); ---18

实例属性都是定义在构造函数中,共享的方法在原型中,两者完美结合,既实现了每个属性有自己的属性值,又实现了共享方法统一定义。

这是目前使用最广泛,认同度最高的一种创建对象的方法;

当然,还有一些其他模式,比如:动态原型模式,寄生构造函数模式等,但是目前很少用到,有兴趣的可以搜索了解一下。

 

 posted on 2018-01-19 16:59  前端爱好者~  阅读(155)  评论(0编辑  收藏  举报