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

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

ContractedBlock.gif ExpandedBlockStart.gif 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。这个在之前已经有讨论过了。

ContractedBlock.gif ExpandedBlockStart.gif 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函数。代码如下:

ContractedBlock.gif ExpandedBlockStart.gif 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.构造函数+原型

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

ContractedBlock.gif ExpandedBlockStart.gif 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.动态原型

ContractedBlock.gif ExpandedBlockStart.gif 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();

转载于:https://www.cnblogs.com/wuxiaoqian726/articles/1985003.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值