本文实例讲述了JavaScript创建对象方法。分享给大家供大家参考,具体如下:
最简单的方式就是创建一个Object对象,并为其添加属性和方法。
//示例代码var person=new Object()person.name="yumi"person.age=18person.job="coder"person.sayName=function(){ alert(this.name)}person.sayName()//输出yumi
这种方式使用同一个接口创建多个对象,会出现大量重复代码。
1.工厂模式
JavaScript中无法创建类,我们可以用函数来封装以特定接口创建对象的细节。
//示例代码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("yumi",18,"coder");var person2=createPerson("echo",21,"player");person1.sayName();//输出yumiperson2.sayName();//输出echo
工厂模式虽然解决了创建多个相似对象的问题,但却没有解决对象识别问题,即怎样知道一个对象的类型。
2.构造函数模式
可以创建自定义的构**造函数,从而定义自定义对象类型的属性和方法。
//示例代码function Person(name,age,job){ this.name=name; this.age=age; this.job=job; this.sayName=function(){ alert(name); }}var person1=new Person("yumi",18,"coder");var person2=new Person("echo",21,"player");person1.sayName();//输出yumiperson2.sayName();//输出echo
创建出的对象既是Object的实例,也是Person的实例,也就是说将来我们可以将它的实例标识为特定类型,这也是优于工厂模式的地方。但是构造函数模式也有缺点,即就是每实例化一个对象,对象方法都会创建一遍,我们可以按如下方法稍加改进:
//示例代码function Person(name,age,job){ this.name=name; this.age=age; this.job=job; this.sayName=sayName;}function sayName(){ alert(name);}var person1=new Person("yumi",18,"coder");var person2=new Person("echo",21,"player");person1.sayName();person2.sayName();
将函数拿到构造函数外部,构造函数内部将sayName属性设成全局sayName函数(一般单独的函数名存放的是指向该函数的指针,而函数名加括号为该函数的执行结果)。但这样做,暴露出的问题是:全局作用域中定义的函数只能被某一个对象调用,不符合全局定义了。而且,如果某个对象有很多方法,这些方法都定义在全局作用域的话,也就没什么封装性可言了。
3.原型模式
前面我们说了,构造函数模式的缺点是属性或方法在构造函数作用域中只能被某个对象调用,想想我们在其他面向对象语言中的处理方式,是将公用的属性方法定义在父类中,然后通过继承父类调用。但是JavaScript中不存在类、继承这些概念,而是通过原型链实现“继承”。
新闻热点
疑难解答
图片精选