`
sitengfei
  • 浏览: 3600 次
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

js原型链图解

阅读更多

http://www.jb51.net/article/30750.htm

      此文源于这篇文章,读了之后感觉原文有点乱,所以整理了一下,画了一张图,初学js不知道对原型链的理解对不对,还请各位大神指教。

     下面图中被一条红线连起来的那3个对象,就是一条原型链。我的理解是:原型链就是由_proto_指针连起来的几个对象组成的一条对象链,使链下游的对象能继承链上游对象(**.prototype)的方法和属性。


直接看代码吧

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
<script type="text/javascript">
//原型链 用于实现js的继承特性
Object.prototype.oShowMe = function (){document.write("function of the root obj<br>");};
Function.prototype.fShowMe = function(){document.write("function of the Function obj<br>");};

function MyFunc(){
	var name = 'tom';
}
MyFunc.prototype.mShowMe = function(){document.write("user-defined function<br>");};
var mfObj = new MyFunc();
mfObj.mShowMe();//output: user-defined function
mfObj.oShowMe();//output: function of the root obj
//mfObj.fShowMe();//output:对象不支持“fShowMe”属性或方法 
MyFunc.fShowMe();//output: function of the Function obj
MyFunc.oShowMe();//output: function of the root obj	
//对new出来的对象的继承是无效的
//var OmfObj = new mfObj;
//OmfObj.oShowMe();//output: 对象不支持此操作 
</script>
</head>
<body>

</body>
</html>
 

这段代码可以直接复制到一个jsp文件运行,读者可以先看下运行结果,自己对照图片思考下。这里我想用自己不科学的语言给你点提示:

1. 每个对象都有两个隐含属性:prototype和_proto_,以实现继承。

2. prototype也是个指针,指向自身的prototype即<this.prototype>,用于被子类继承。

3. _proto_可以理解为一个指针,指向父类的 <父类.prototype>,用于继承父类在prototype中声明的属性。

ps:上述几条为了方便理解,说的很不全面。也不标准,也为js里没有父类这种说法。

 

 

在上面这段代码中,我给Object,Function这两个js内部对象增加了oShowMe(),fShowMe()这两个方法,以查看Object和Function的子类有没有继承到这两个对象(的prototype)。

从其运行结果可以知道:

1. Object对象是所有对象的根类 ,所有的对象都继承自Object,所以图中几个<**.prototype>最后都指向<Object.prototype>,同时所有对象都能使用oShowMe()这个方法。

 

2. function MyFunc是个对象,继承自Object类 ,废话,第一条里面不说了么Object是所有对象的根,root

 

function aFunc(a,b){
return a+b;
}

 这是最常见的一种声明js函数的方法,同时这个函数又是一个js对象,最初我对这种方法非常不理解,干嘛要搞的这么含糊,想java那样定义明确的class,对象必须要new的多好,但这种规则,正是js比java灵活的体现,如果java是郭靖,那js一定是黄老邪,实在是太邪了。。。

跑题了,下面看另一种声明js函数的方法

 

Function aFunc = new Function(a,b,"return a+b");

 这个函数是以对象的形式声明的,用Function声明对象的效果与用function声明函数是一样的,而且function这种声明方式(其实这样的声明的function被称为<aFunc.prototype>的constructor,即构造器,看图)在js解释器中的处理,也是先转换为Function对象声明的方式的。

所以如第一段代码所示:函数MyFunc可以调用到Object中的函数oShowMe();,因为MyFunc这个函数(也是对象)继承自Object。

3. 原型链的作用是实现继承:

如图中红线所示:我们调用mfObj.mShowMe();时,mfObj对象并未声明方法mShowMe,所以它沿着原型链向上层查找,在<MyFunc.prototype>中找到了mShowMe()。调用mfObj.oShowMe();时,mfObj同样沿着原型链向上层查找到<Object.prototype>才找到oShowMe();

这就实现了js方法中的继承,同时验证了提示中的第二,第三条。

 

 

我翻了下书总结下js实现继承的其他方法

1. 对象冒充

2. call()方法

3. apply()方法

4. 原型链

5.原型链+对象冒充 混合式

这些方法我还没看,看了之后有新的感悟的话,还会回来更新。

 

可能有些地方说的不太清楚,说的清楚的估计也难免有错误,希望大神不吝指正,大家共同学习。

 

 

 

 

 

  • 大小: 106.8 KB
分享到:
评论

相关推荐

    JavaScript原型链简单图解

    JavaSciptDOM基本操作,JavaScipt函数基础,JavaScipt流程语句,JavaScript变量,JavaScript数据类型,JavaScript数组,JavaScript正则表达式,JavaScript字符串函数,Window对象等图解。JS高手进阶的工具图谱

    图解JS原型和原型链实现原理

    JavaScript中的原型和原型链是其继承机制的核心,理解这两者对于深入学习JS至关重要。本文将通过详细的图解和实例代码,帮助你理解这两个概念及其实现原理。 首先,我们需要明白JavaScript的发展背景。JavaScript...

    原型链全套图解.rar

    在JavaScript中,原型链是理解对象继承和属性查找机制的关键概念。它是一种基于原型(prototype)的继承方式,使得一个对象能够从另一个对象那里继承属性和方法。在本压缩包"原型链全套图解.rar"中,包含了全面的...

    [js高手之路]图解javascript的原型(prototype)对象,原型链实例

    本文将深入探讨原型对象、原型链的概念,并通过实例解析它们的工作原理。 首先,每个函数都有一个名为`prototype`的属性,它指向一个对象,即构造函数的原型对象。例如,在以下代码中,`CreateObj.prototype`是指向...

    [js高手之路]从原型链开始图解继承到组合继承的产生详解

    于javascript原型链的层层递进查找规则,以及原型对象(prototype)的共享特性,实现继承是非常简单的事情 一、把父类的实例对象赋给子类的原型对象(prototype),可以实现继承 function Person(){ this.userName =...

    javaScript核心原理

    ### JavaScript核心原理:深入理解对象与原型链 #### 前言 JavaScript 是一门高度抽象、面向对象的语言,广泛应用于Web开发中。它的核心特性之一就是处理对象(Object)的能力。对象不仅构成了JavaScript的基础数据...

    javascript图解

    4. **原型与原型链**:JavaScript对象都有一个`__proto__`属性,指向创建它的函数的原型。通过原型链,对象可以访问到原型上的属性和方法,实现继承。 5. **对象**:JavaScript对象是键值对的集合,可以使用字面量...

    构造函数 原型对象 实例、图解

    原型对象是 JavaScript 中的一个重要概念,它是对象的原型链的起点。每个对象都有一个原型对象,原型对象定义了对象的行为和属性。原型对象是通过构造函数创建的,在构造函数中,我们可以使用 `prototype` 属性来...

    详解帮你彻底搞懂JS中的prototype、__proto__与constructor(图解)

    当我们尝试访问一个对象的属性时,如果该对象自身没有这个属性,JavaScript会沿着`__proto__`链向上查找,直到找到该属性或到达原型链的顶端——`null`。这个查找过程形成了所谓的原型链。 其次,`prototype`属性是...

    Javascript思维导图

    对象和原型是JS的核心部分,思维导图会详细阐述对象创建(字面量语法、构造函数、工厂函数、原型链)、原型和原型链、对象方法(如hasOwnProperty、toString、valueOf)以及对象扩展(如ES6中的类和模块系统)。...

    帮你彻底搞懂JS中的prototype、__proto__与constructor(图解)

    `__proto__`是一个对象到对象的引用,当试图访问对象的一个属性时,如果对象本身没有这个属性,JavaScript引擎会沿着原型链向上查找,直到找到该属性或者到达原型链的终点——`null`。这种通过`__proto__`连接形成的...

    Desktop.rar

    结合提供的图片文件名,我们可以推测这些图片可能详细展示了JavaScript中对象、原型、实例以及构造函数之间的关系,包括它们如何构成原型链,以及如何通过构造函数创建和初始化对象。这些图解对于理解JavaScript中的...

    teacher-tmp.zip

    1. **简单原型链.jpg** 和 **原型链.jpg**: 这两个文件可能包含有关JavaScript原型链的可视化解释,原型链是JavaScript实现继承的核心机制,它允许对象之间共享属性和方法。 2. **3-递归函数执行流程.jpg**:递归...

    javascript课件

    源码可能涵盖了DOM操作、事件处理、AJAX异步通信、闭包、原型链、面向对象编程等高级主题。此外,源码还可能涉及jQuery、React、Vue等流行库或框架的应用,帮助学生了解JavaScript在现代Web开发中的实际应用。 电子...

    javascript超详尽学习资料(源码,教材,ppt)

    此外,还会涉及更高级的主题,如闭包、原型链、异步编程(Promise和async/await)、ES6及更高版本的新特性。这些教材是系统学习JavaScript必不可少的工具,能够帮助你构建坚实的基础。 PPT文件可能包含了教学讲座或...

    prototype与__proto__区别详细介绍

    在JavaScript中,`prototype`和`__proto__`都是与对象继承和原型链紧密相关的概念,但它们在用途和性质上有所不同。以下是这两者的主要区别和详细解释: 1. **prototype(原型)** - `prototype`是函数特有的属性...

    Head Firs tJavaScript

    3. **对象和原型**:JavaScript中的对象是属性和方法的集合,原型链是JavaScript实现继承的核心机制。了解如何创建对象、访问和修改对象属性,以及原型和构造函数的工作原理。 4. **事件处理**:JavaScript在网页中...

    jszongjie.pdf

    在前端开发的学习过程中,理解JavaScript内存空间的机制对于深入理解这门语言至关重要。由于JavaScript具有自动垃圾回收机制,内存管理往往不被...这对于进一步学习闭包、函数作用域、原型链等高级特性也是大有裨益的。

Global site tag (gtag.js) - Google Analytics