`
小嘴冰凉
  • 浏览: 448092 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

详解javascript类继承机制的原理

    博客分类:
  • js
阅读更多
目前 javascript的实现继承方式并不是通过“extend”关键字来实现的,而是通过constructor function和prototype属性来实现继承。首先我们创建一个animal类

js 代码

var = function(){  //这就是constructor function 了 

   this.name = 'pipi';    
   this.age = 10;      
   this.height = 0;      
}      
//建立一个动物的实例    
var a1 =  new animal ();   

构造函数与其他普通函数区别在于,1.构造函数里有 this关键字,2.调用构造函数是使用的new关键字。通过new运算符调用构造函数animal 后,系统就会返回一个对象,这个对象就相当于

js 代码
var a1 = { name:'pipi' ,age:10,height:0 }  
  
//或者  
var a1 = new Object();  
a1.name='pipi';  
a1.age = 10;  
a1.height = 0; 

等同这样的方式来产生js对象。

到这里我们知道如何在js中定义一个类了,接下来我们展示如何写一个cat


js 代码

var cat = function(){    
this.play = function(){     
alert('cat play')    
}    
}    
cat .prototype = new animal ();    
//prototype 属性指向一个对象 

var c1 = new cat();


到这里,cat就继承了animal 对象,类cat的一个实例对象c1拥有属性name,age,height,和方法play了。
那么prototype起到了一个什么样的作用呢?
prototype就好比一个指针,它指向一个object,这个object就称为子类对象的原型。当cat的对象被创建的时候,由于cat的构造函数拥有prototype属性,那么cat的实例就会间接指向这个原型对象了(说成间接的是因为每个object都有一个constructor 属性指向它的构造函数)。
那么问题来了,“当我们修改对象 c1 的name属性的时候,会不会修改它prototype的name属性值呢?”,答案是否定的。
接下来详细解析:
1.访问name属性: 首先当我们第一次访问c1.name的属性的时候,我们会得到值“pipi”,这个和我们预料中的一样。但是计算过程你未必知道。
它计算的过程是这样的:第一步:检查c1对象中是否有name属性,找到的话就返回值,没有就跳到第二步,显然没有找到,因为cat的构造函数中没有定义。第二步:当第一步没有找时,去间接访问prototype对象所指向的object,如果在prototype对象中找到的name属性的话,就返回找到的属性值。如果还是没有找到的话,再去递归地寻找prototype对象的prototype对象(去找它的爷爷),一直到找到name属性或者没有prototype对象为止。如果到最后还是没有找到name属性的话就返回undefined。

2.设定name属性:当我们设定c1对象的name属性时,及调用 c1.name= ' new name';  这个过程就简单多了。首先检查是否对象已有该属性,若已存在则修改当前值,若不存在则为该对象新增一个属性并设定当前值。值得一提的是,在设定值的过程中没有去访问prototype属性。

为了加深理解,我们再看一个 read-write-read 的过程,第一次read的时候,由于自己的对象没有name属性,那么就会返回的原型对象的name属性的值。第二步,写入name的值,同样没发现本身对象有name属性,那么就在本身对象上新建一个name属性,然后赋值。第三步,再次读取name属性,由于在第二步中已经新建了name属性,此时就返回在第二步中设定的值。值得一提的是,在这三步中没有改变原型对象的值。

好了,到此详细分析了 javascript对象是如果实现继承的,其实和其他的面向对象语言不一样的是,javascript的继承机制是对象的原型继承而不是类型继承。


分享到:
评论
1 楼 jimichan 2009-03-23  
请表明转载来源!!!

相关推荐

    javascript继承机制实例详解

    主要介绍了javascript继承机制,以实例形式详细分析了javascript继承的原理与基于原型链的继承实现方法,具有不错的参考借鉴价值,需要的朋友可以参考下

    基于JavaScript实现继承机制之构造函数方法对象冒充的使用详解

    这是因为 JavaScript 中的继承机制并不是明确规定的,而是通过模仿实现的。这意味着所有的继承细节并非完全由解释程序处理。作为开发者,你有权决定最适用的继承方式。最原始的继承实现方式就是对象冒充,下面着重...

    基于JavaScript实现继承机制之原型链(prototype chaining)的详解

    如果用原型方式重定义前面例子中的类,它们将变为下列形式: 代码如下:function ClassA() {} ClassA.prototype.color = “blue”;ClassA.prototype.sayColor = function () { alert(this.color);}; ...

    Javascript原型链及instanceof原理详解

    instanceof:用来判断实例是否是属于某个对象,这个判断依据是什么呢? 首先,了解一下javascript中的原型继承的基础知识: javascript中的对象都有一个__proto__属性,这...//继承机制 function A(){ } A.prototype.

    JS原型和原型链原理与用法实例详解

    Javascript语言的继承机制一直很难被人理解。 它没有”子类”和”父类”的概念,也没有”类”(class)和”实例”(instance)的区分,全靠一种很奇特的”原型链”(prototype chain)模式,来实现继承。 Brendan ...

    庖丁解牛:纵向切入ASP.NET 3.5控件和组件开发技术

    8.2 clientscriptmanager类功能详解 301 8.2.1 registerarraydeclaration方法 301 8.2.2 registerclientscriptblock方法 302 8.2.3 registerclientscriptinclude方法 303 8.2.4 registerclientscriptresource...

    php网络开发完全手册

    5.5 类的引用、扩展与继承 75 5.5.1 类的引用 75 5.5.2 类的扩展与继承 76 5.6 操作与调用 77 5.6.1 静态类的调用 77 5.6.2 实例类型的判断方法instanceof 78 5.6.3 对象的克隆 78 5.7 一些设计观念 80 5.7.1 策略...

    庖丁解牛 纵向切入ASP.NET 3.5控件和组件开发 part1

    8.2 clientscriptmanager类功能详解 301 8.2.1 registerarraydeclaration方法 301 8.2.2 registerclientscriptblock方法 302 8.2.3 registerclientscriptinclude方法 303 8.2.4 registerclientscriptresource...

    庖丁解牛 纵向切入ASP.NET 3.5控件和组件开发 part2

    8.2 clientscriptmanager类功能详解 301 8.2.1 registerarraydeclaration方法 301 8.2.2 registerclientscriptblock方法 302 8.2.3 registerclientscriptinclude方法 303 8.2.4 registerclientscriptresource...

    庖丁解牛纵向切入ASP.NET 3.5控件和组件开发技术.pdf

    8.2 clientscriptmanager类功能详解301 8.2.1 registerarraydeclaration方法301 8.2.2 registerclientscriptblock方法302 8.2.3 registerclientscriptinclude方法303 8.2.4 registerclientscriptresource方法304...

    史上最全韩顺平传智播客PHP就业班视频,10月份全集

    9-28 6 javascript类与对象 9-28 7 给对象指定成员函数 自定义工厂方法 9-30 1 课程回顾 9-30 2 javascript的闭包 js变量作用域 9-30 3 仿超级玛丽兄弟游戏制作 9-30 4 构造方法 对象的常用操作 9-30 5 面向对象的...

    史上最全传智播客PHP就业班视频课,8月份视频

    9-28 6 javascript类与对象 9-28 7 给对象指定成员函数 自定义工厂方法 9-30 1 课程回顾 9-30 2 javascript的闭包 js变量作用域 9-30 3 仿超级玛丽兄弟游戏制作 9-30 4 构造方法 对象的常用操作 9-30 5 面向对象的...

    史上最全韩顺平传智播客PHP就业班视频,9月份全集

    9-28 6 javascript类与对象 9-28 7 给对象指定成员函数 自定义工厂方法 9-30 1 课程回顾 9-30 2 javascript的闭包 js变量作用域 9-30 3 仿超级玛丽兄弟游戏制作 9-30 4 构造方法 对象的常用操作 9-30 5 面向对象的...

    (全)传智播客PHP就业班视频完整课程

    9-28 6 javascript类与对象 9-28 7 给对象指定成员函数 自定义工厂方法 9-30 1 课程回顾 9-30 2 javascript的闭包 js变量作用域 9-30 3 仿超级玛丽兄弟游戏制作 9-30 4 构造方法 对象的常用操作 9-30 5 面向对象的...

    韩顺平PHP JS JQUERY 所有视频下载种子 货真价实

    9-28 6 javascript类与对象 9-28 7 给对象指定成员函数 自定义工厂方法 9-30 1 课程回顾 9-30 2 javascript的闭包 js变量作用域 9-30 3 仿超级玛丽兄弟游戏制作 9-30 4 构造方法 对象的常用操作 9-30 5 面向对象的...

    blog-note:阳姐讲前端:一个野生程序媛的成长之路

    闭包原理详解 一文搞懂this 内存泄漏问题 原型和原型链 内置对象 对象和类 深拷贝和浅拷贝 原型和原型链 封装、多态、继承 多种继承方式 异步编程 宏任务和微任务 异步解决方案 手写Promise DOM BOM ajax 存储

    asp.net知识库

    运算表达式类的原理及其实现 #实现的18位身份证格式验证算法 身份证15To18 的算法(C#) 一组 正则表达式 静态构造函数 忽略大小写Replace效率瓶颈IndexOf 随机排列算法 理解C#中的委托[翻译] 利用委托机制处理.NET中...

    亮剑.NET深入体验与实战精要2

    13.6.1 优先使用(对象)组合,而非(类)继承 478 13.6.2 针对接口编程,而非(接口的)实现 481 13.6.3 开放-封闭法则(OCP) 482 13.6.4 Liskov替换法则(LSP) 485 13.6.5 单一职责原则(SRP) 486 13.6.6 依赖...

    亮剑.NET深入体验与实战精要3

    13.6.1 优先使用(对象)组合,而非(类)继承 478 13.6.2 针对接口编程,而非(接口的)实现 481 13.6.3 开放-封闭法则(OCP) 482 13.6.4 Liskov替换法则(LSP) 485 13.6.5 单一职责原则(SRP) 486 13.6.6 依赖...

    python入门到高级全栈工程师培训 第3期 附课件代码

    08 类的装饰器的基本原理 09 类的装饰器增强版 10 类的装饰器的应用 11 自定制property 12 自定制property流程分析 13 自定制property实现延迟计算功能 14 property补充 15 元类介绍 16 自定义元类 17 函数复习 18 ...

Global site tag (gtag.js) - Google Analytics