注册 登录  
 加关注
查看详情
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

篝火旁的匠人

篝火旁的匠人,开始了思考……

 
 
 

日志

 
 

JavaScript原型继承  

2009-08-05 16:31:22|  分类: 技术 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

   首先应该理解的问题就是什么是原型,js为什么要引入原型。JS是一个面向对象的语言,但是和java不同,采用的是以原型对象为基础的继承机制。
   1、首先看看在js如何定义一个对象,慢慢阐述为何要引入原型。
 在js中,定义一个对象有两种方式,一种是通过对象直接量创建并初始化一个新对象,有属性说明列表如:
 var person = {
    name : "juven",
    age : 22,
 };
   上面这种方式定义对象有很大的缺陷,就是不可再次实例化,就是说,这种方式定义了一个对象实例,而不是一个对象。(自己理解的)
 第二种方式就通过运算符new创建,但是这个运算符之后必须有用于初始化对象的构造函数。如:
 function person(name,age){
    this.name = name;
    this.age = age;
 }
 这样就解决了方式一的缺陷。采用这种方式接下来,我们就想给这个对象加上方法,比如向世界问好的方法sayHello()。
 比如(方式一):
 fuction person(name,age){
    this.name = name;
    this.age = age;
 }

 function sayHello(){
    alert("Hello world!");
 }

 var p = new person("juven",22);
 p.sayHello = sayHello;
 p.sayHello();

 再比如(方式二):
 function sayHello(){
    alert("Hello world!");
 }

 fuction person(name,age){
    this.name = name;
    this.age = age;
    this.sayHello = sayHello;
 }

 var p = new person("juven",22);
 p.sayHello();

 上面两种方式又有什么缺陷呢?方式一,在调用sayHello()之前,必须将此方法添加给person对象的属性,麻烦。方式二,如果实例化了5个person对象,每个对象实例中都有一个sayHello属性,并且都一样,浪费了内存空间。为了弥补这个这个缺陷,引入原型。
 2、原型的作用机制
 在js中,每个函数对象都有一个prototype属性,并且引用了一个对象,称为原型对象(当然刚刚初始化的时候,是空的)。接下来,我们可以给原型对象添加属性和方法。当再次实例化一个对象时,这个对象实例“继承”原型对象的属性和方法。这样就可以再不浪费内存空间的前提下,访问共有的方法和属性。
 function sayHello(){
    alert("Hello world!");
 }

 fuction person(name,age){
    this.name = name;
    this.age = age;
 }

 person.prototype.sayHello = sayHello;

 var p = new person("juven",22);
 p.sayHello();
 当我们访问一个对象实例p的方法sayHello时,首先会检查p有没有方法sayHello,如果没有,再去访问原型对象。当然我们也可以对方法sayHello进行修改,但是修改的这个方法就属于实例p,并没有修改原型对象。

  评论这张
 
阅读(584)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018