关于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.原型模式
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的了。这是现在用的比较多的创建对象的方式了。
当然还有寄生构造函数模式和稳妥构造函数模式,这部分内容在后期会加入。
//第一次写博客,各位轻拍~
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。