关于js中Object的创建

对象的创建

js 中的一般对象创建可以用构造函数和对象字母量来创造,但是他们都有明显的缺点,就是会产生大量的复用,所以往后的探索中主要有三种对象创建模式(工厂模式,构造函数模式和原型模式)来进行对对象创建进行优化。

1.工厂模式

  即使用工厂函数,建造一个对象并返回,看以下代码:
function createPerson(name,age){
     var o = new Object();
     o.name = name;
     o.age = age;
o.getName =
function(){
      alert(this.name);
  }
  return o;
}
var person1 = createPerson(‘Peter‘,15);

  createPerson即是一个能够创建含名字,年龄的Person对象并返回的工厂函数,每次返回的对象中都有 两个属性,但是这种方法有一个缺陷,即创建出来的对象无  法进行识别(即无法用person1 instanceOf Person),这在下一种方法构造函数模式里得到解决。

2.构造函数模式

   ECMAScript中Array和Object等构造函数都可以创建对象,我们亦可以自己定制构造函数。构造函数模式是通过构造函数中直接自定义对象,通过new 的方式形成实例,看一下代码

function Person(name,age){
      this.name = name;
      this.age = age;
    this.getName = function(){
      alert(this.name);
    }
}
var person1 = new Person(‘Perter‘,15);

  以上代码是将上个例子进行重构,可以注意到,这两个函数的区别在于没有显示的创建对象,直接将属性赋给了this,然后没有了return,为了创建一个新的实例,必  须使用new,以这种方式创建实例会经历一下几个过程:

  1.创建一个新对象;

  2.将构造函数的作用域赋给这个新对象(因此this就指向了新对象)

  3.执行构造函数中的代码(为新对象赋值)

  4.返回新对象

  在以上的person1中保存了一个Person的实例,这个实例中会有一个constructor属性,它指向的是Person(即指向构造函数),可以运行一下代码查看:

alert(person1.constructor == Person);

  constructor可以用来检测对象类型,但是相比之下,还是instanceOf比较可靠,在以上创造的例子中,既是Person的实例,也是Object的实例,可以运行以下代码  来查看:

alert(person1 instanceOf Person);

alert(person1 instanceOf Object);

     构造函数仍然存在一些问题,我们可以看到,每进行一次实例化,就会重新创建一个getName的函数,这个问题完全可以用原型模式的方式解决。

3.原型模式

     在我们创建的每隔函数中都会有一个prototype属性,这个是一个指针,指向了一个对象,这个对象可以被其所创建的所有实例进行共享,使用方式如下:
function Person(){     
}
Person.prototype.name = ‘Perter‘;
Person.prototype.age = 15;
Person.prototype.getName = function(){
    alert(this.name);
}
var person1 = new Person();
var person2 = new Person();
alert(person1.getName == person2.getName);   //true
person1.name = ‘Jahn‘;
alert(person2.name);              //Jahn

由于属性方法的共享,通过person1修改name会在person2中体现出来,这种特性在一些属性上并不好,这点的改善可以用后面的混合模式来解决。在prototype中包含一个指针,constructor,这个指针指向的是构造函数Person。在自定义了构造函数后,原型对象默认只会得到一个constructor属性,其余都是从Object继承。

4.混合模式

代码如下:

function Person(name,age){    
    this.name = name;
    this.age = age; 
}
Person.prototype ={
        constructor:Person,
        getName:function(){
            alert(this.name);
        }
}
var person1 = new Person();   

即通过混用构造函数和原型的方式,在不同的地方定义共有和私有的内容,这样就可以避免一些函数重复申明。注意到这次的prototype用了对象字面量的方式,在其中加了constructor,这个就是为了保留原型对于构造函数指针的保留,这样就在后面的内容中可以用person1.constructor来看到底是由哪个构造函数创建person1的了。这是现在用的比较多的创建对象的方式了。

当然还有寄生构造函数模式和稳妥构造函数模式,这部分内容在后期会加入。

 

//第一次写博客,各位轻拍~

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。