JavaScript高级编程学习8——对象的声明

        ECMAScript没有class关键字,ECMAScript的对象可以在对象声明之后再给他添加属性。于是我们在初次编写代码时会用下面的写法。但是如果想再创建person2,person3....呢?是不是还需要这样反复写着这些代码,这样显然是不合理的。于是又着接下来的改进方式。

View Code
1 var person1 = new Object();
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。这个在之前已经有讨论过了。

View Code
1 //使用工厂方式创建对象
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函数。代码如下:

View Code
1 function 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.构造函数+原型

     构造函数方式就是将我们要定义的类名定义为方法名。并且利用原型解决函数的重复创建。

View Code
1 function Person(name, age) {
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.动态原型

View Code
1 //用动态原型方式声明
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();
posted @ 2011-03-15 16:09  雁北飞  阅读(180)  评论(0编辑  收藏  举报