本文实例讲述了JavaScript实现创建自定义对象的常用方式。分享给大家供大家参考,具体如下:
对象字面量方式是创建自定义对象的首选模式,简单方便。
var per = { name:'zhangsan', age:25, job:'html', sayName:function(){ alert(this.name); }}
缺点:使用同一个接口创建很多对象,会产生大量的重复代码。比如我想再创建一个per1对象,我就得把上面的代码再重新写一遍,改变不同的属性值。
工厂模式抽象了创建具体对象的过程。由于在ECMAScript中无法创建类,开发人员就发明了一种函数,用函数来封装以特定接口创建对象的细节,如下面的例子:
function createPerson(name,age,job){ var o = new Object(); o.name = name; o.age = age; o.job = job; o.sayName = function(){ alert(this.name); } return o;}var person1 = createPerson('zhang',30,'java');var person2 = createPerson('zhao',25,'php');
函数createPerson()
能够根据接受到的参数来构建一个包含所有必要信息的Person对象。可以无数次的调用这个函数,而每次它都会返回一个包含三个属性和一个方法的对象。
缺点:工厂模式虽然解决了创建多个相似对象的问题,但却没有解决对象识别的问题(即怎样知道一个对象的类型)。
可以使用构造函数模式将前面的例子重写如下:
function Person(name,age,job){ this.name= name; this.age = age; this.job = job; this.sayName = function(){ alert(this.name); }}var person1 = new Person('zhang',30,'java');var person2 = new Person('zhao',25,'php');
创建自定义的构造函数意味着将来可以将它的实例标识为一种特定的类型。而这正是构造函数模式胜过工厂模式的地方。
然而,使用构造函数的主要问题,就是每个方法都要在每个实例上重新创建一遍。在上面的例子中,person1和person2都有一个名为sayName()
的方法,但那两个方法不是同一个Function的实例,创建两个完成同样任务的Function实例的确没有必要;况且有this对象在,根本不用在执行代码前就把函数绑定到特定对象上面。因此可以像下面这样,通过把函数定义转移到构造函数外部来解决这个问题。
function Person(name,age,job){ this.name= name; this.age = age; this.job = job; this.sayName = sayName();}function sayName(){ alert(this.name);}var person1 = createPerson('zhang',30,'java');var person2 = createPerson('zhao',25,'php');
在这个例子中,我们把sayName()
函数的定义转移到构造函数外部。而在构造函数内部,我们将sayName属性设置成等于全局的sayName函数,这样person1和person2对象就共享了在全局作用域中定义的同一个
新闻热点
疑难解答
图片精选