ECMAScript没有class关键字,ECMAScript的对象可以在对象声明之后再给他添加属性。于是我们在初次编写代码时会用下面的写法。但是如果想再创建person2,person3....呢?是不是还需要这样反复写着这些代码,这样显然是不合理的。于是又着接下来的改进方式。
2 person1.name = ' wuxq ' ;
3 person1.age = 24 ;
4 person1.ShowInfo = function () {
5 document.write( ' 姓名: ' + person1.name + ' 年龄: ' + person1.age);
6 }
7 person1.ShowInfo();
1.工厂方式
可以引入一个方法专门用来创建我们需要的对象,然后将这个对象返回。代码如下。但是下面的代码会有一个弊端,就是person2和person3的ShowInfo方法是不同的引用,也就是在内存中存在着两份ShowInfo。这个在之前已经有讨论过了。
2 function CreatePerson(name, age) {
3 var person = new Object();
4 person.name = name;
5 person.age = age;
6 person.ShowInfo = function () {
7 document.write( ' 姓名: ' + person.name + ' 年龄: ' + person.age);
8 }
9 return person;
10 }
11 var person2 = CreatePerson( ' wuxq ' , 24 );
12 person2.ShowInfo();
13 var person3 = CreatePerson( ' kaka ' , 28 );
14 person3.ShowInfo();
为了解决不同对象各自存在一个方法,解决的问题就是在CreatePerson方法之外创建一个专门的ShowInfo函数。代码如下:
2 document.write( ' 姓名: ' + this .name + ' 年龄: ' + this .age);
3 }
4 function CreatePerson(name, age) {
5 var person = new Object();
6 person.name = name;
7 person.age = age;
8 person.ShowInfo = ShowInfo;
9 return person;
10 }
但是上面虽然解决了重复创建对象的问题,但是存在着另外一个问题,就是ShowInfo看起来不想person对象的方法。于是就引出了构造函数方式的创建对象。
2.构造函数+原型
构造函数方式就是将我们要定义的类名定义为方法名。并且利用原型解决函数的重复创建。
2 this ._name = name;
3 this ._age = age;
4
5 }
6 Person.prototype.ShowInfo = function () {
7 document.write( ' 姓名: ' + this ._name + ' 年龄: ' + this ._age);
8 }
9 var person = new Person( ' wuxq ' , 24 );
10 person.ShowInfo();
上面的书写方式看起来还不是那么直观,因为Person.prototype.ShowInfo是定义在Person函数外面能不能有一种方法将其定义在Person里面,于是就引出了动态原型。
4.动态原型
2 function Person(name,age) {
3 this ._name = name;
4 this ._age = age;
5 if ( typeof Person._innitialized == ' undefined ' ) {
6 Person.prototype.ShowInfo = function () {
7 document.write( ' 姓名: ' + this ._name + ' 年龄: ' + this ._age);
8 }
9 Person._initialized = true ;
10 }
11 }
12 var person = new Person( ' wuxq ' , 24 );
13 person.ShowInfo();