JavaScript原型链的理解

一、原型链的概念

JavaScript是一门面向对象的编程语言,JavaScript 中的所有事物都是对象,并且对象与对象之间不是彼此独立的,而是有“继承”关系的。

这种“继承”关系与Java或者C#中的继承不同。Java或C#中是有类的概念的,子类继承父类,通过extends关键字实现;而JavaScript中没有真正意义上的class(类),但有与之类似的概念——原型对象;A继承B,则A的“__proto__”属性会指向B的“prototype”属性,从而有以下示意图:

A与B的关系为: A.__proto__   ---------->   B.prototype  , 这句话的意思就是,A的原型(__proto__) 指向 B的原型对象(prototype)。

从A继承B的示意图中,我们看到一条具有指向关系的链,那么这是不是就是今天的主题——原型链 呢?答案是:不是

原型链要求末尾节点为null,B.prototype 不等于null,谁的原型会为null呢?答案是:Object对象的原型对象——Object.prototype,所以有以下示意图:

所以,我把原型链的定义概括为:一群具有继承关系的对象,通过__proto__属性建立指向关系,并最终指向null,从而形成一条指向关系链,我们称之为原型链。

二、为什么会有这样的指向关系

现在,虽然知道了什么是原型链,但是为什么是这样的指向关系,形成这样的一条链,下面我们继续来探讨:

首先,了解概念:

①、对象的分类    如上文所说,JavaScript中所有的事物都是对象,而这些对象,可以分为两大类:函数对象普通对象。分类的依据是:是否具有原型对象(prototype),或者是否具有prototype属性。函数对象具有prototype属性,而普通对象没有;

②、prototype    原型对象,对象中的所有属性和方法,将继承给子对象,由子对象们共享;

③、__proto__    原型。任何由继承而来的对象,都有且仅有一个原型,并且由其__proto__属性指明。

由于JavaScript中一切皆对象,并且这些对象最终都继承自Object对象,所以在原型链中末尾的两个节点,一定是Object.prototype和null。

三、对象

前文中,我们无数次提到了一个概念,那就是对象,什么是对象?对象即属性和方法的集合,最典型的

var obj = {
        name: ‘hjx‘,
        age: 24,
        sayHello: function() {
            console.log(‘Hello!‘);
        }
}

obj既为一个对象,此对象有属性name,age,有方法sayHello()。仅以“属性和方法的集合”这几个字的解释,我们还很难理解JavaScript中的继承关系和原理,所以,引入一下概念:

、隐式属性   由__proto__属性指向的属性和方法。

、显示属性    非__proto__属性指向的属性和方法,显示属性分为共享属性和非共享属性

③、共享属性    继承给子对象,由子对象共享的属性和方法。(共享:所有子对象的公共资源,一旦改变,所有子对象访问时均已改变。本质上是在继承的时候,所有子对象的__proto__属性指向它,在内存中此属性仅此一份,子对象和父对象均可去读写)

④、非共享属性(本地属性)    继承给子对象时,由子对象单独享有的属性和方法,也成为本地属性。(单独享有:继承时,在每个子对象的内存空间中都复制了一份,在子对象中各自独立)

用一个等式来表达对象: 对象  =  显示属性(共享属性 + 本地属性) + 隐式属性

四、关系图

关系图总结:

①、子对象的__proto__属性指向父对象的prototype属性(子对象的原型指向父对象的原型对象);

②、Object对象的__proto__属性指向Function对象的prototype属性(Object对象的原型指向Function对象的原型对象);

③、Function对象的__proto__属性指向自己的prototype属性(Function对象的原型指向自己的原型对象);

④、Function对象的prototype属性的__proto__属性指向Object的prototype属性(Function对象的原型对象的原型指向Object对象的原型对象,因为,Function对象的原型对象是一个对象,由Object对象继承而来)

⑤、Object对象的prototype属性的__proto__属性指向null(Object对象的原型对象的原型指向null,因为,一切对象的原型最终都指向Object对象的原型对象,然而Object对象的原型对象又是一个对象,JavaScript规定它指向null,所以Object对象的原型对象Object.prototype总是在原型链上,除null意外的顶端位置)

完~

原文地址:https://www.cnblogs.com/hjx-blog/p/9188526.html

时间: 2024-10-08 09:47:40

JavaScript原型链的理解的相关文章

深入理解JavaScript原型链

前言 最近碰到一个题,大家可以试下. Object.prototype.a = function() { console.log("aaa "+this.name); }; Function.prototype.b = function() { console.log("bbb "+this.name); }; function Person(name) { this.name = name; } var person = new Person("Chin

轻松搞定javascript原型链 _proto_

//如有错误或不同观点,欢迎批评与讨论!首先,prototype出现的目的,是为了解决 代码重用 的问题 , prototype 相当于是在内存上划分出一个公共的区域, 专用于存放 实例化对象 的相同方法或属性, 一份代码,人人可用:为方便理解,我们可以先把prototype 当作是CSS中的 class,在prototype上加方法和属性,那么其它对象就会拥有这些方法和属性, 但这些代码紧有一份!<script>function Person(){this.name = '张三'; this

原型链的理解

### 原型链的理解 #### 概念 + javascript每一个对象**包括原型对象**都有一个内置的`proto`属性指向创建他的函数对象的原型对象,即`prototype`属性 #### 作用 + 实现对象的继承 ### 理解 1.函数对象 + 在javascript中,函数就是对象 2.原型对象 + 当定义一个函数对象的时候,会包含一个预定的属性,`prototype`,这就属性称之为原型对象 3.\__proto__ + javascript 在创建对象的时候,都会有一个\_prot

Javascript 原型链资料收集

Javascript 原型链资料收集 先收集,后理解. 理解JavaScript的原型链和继承 https://blog.oyanglul.us/javascript/understand-prototype.html 继承与原型链 https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Inheritance_and_the_prototype_chain 最详尽的 JS 原型与原型链终极详解,没有「可能是」. https://www.j

对原型链的理解 语言表达能力不好 直接用代码,哈

分享一下 我对原型和原型链的理解 原型对象: function People(nameValue,ageValue,fondValue)            {                this.name = nameValue;                this.age = ageValue;                this.fond = fondValue;            } People.prototype.rule = function()         

JavaScript学习总结(十七)——Javascript原型链的原理

一.JavaScript原型链 ECMAScript中描述了原型链的概念,并将原型链作为实现继承的主要方法.其基本思想是利用原型让一个引用类型继承另一个引用类型的属性和方法.在JavaScript中,用 __proto__ 属性来表示一个对象的原型链.当查找一个对象的属性时,JavaScript 会向上遍历原型链,直到找到给定名称的属性为止! 比如现在有如下的代码: 扩展Object类,添加Clone和Extend方法 1 /*扩展Object类,添加Clone,JS实现克隆的方法*/ 2 Ob

明白JavaScript原型链和JavaScrip继承

原型链是JavaScript的基础性内容之一.其本质是JavaScript内部的设计逻辑. 首先看一组代码: 1 <script type="text/javascript"> 2 function parent(){ 3 this.name="cehis"; 4 } 5 6 function son(){ 7 this.age=11; 8 } 9 10 function sub(){ 11 this.sex="nan"; 12 }

面向对象(2 )构造函数 原型 原型链的理解

面向对象(2) 原型 原型链的理解 1.面向对象的目的就是生成对象object. 2.生成对象的方式 (1)单例模式(字面量定义)var obj={} (2)类的实例 var obj=new Object() (3)工厂模式 (4)构造函数 工厂模式和构造函数的区别? 工厂模式,生成的对象必须要返回,构造函数模式不用return,构造函数模式默认return旳是this,在构造函数内的this就是实例对象. 构造函数如果人为return的不是对象,直接忽略,如果人为return的是对象,就取代t

web前端安全-JavaScript 原型链污染

0x01 前言 最近看到一篇原型链污染的文章,自己在这里总结一下 0x02 javascript 原型链 js在ECS6之前没有类的概念,之前的类都是用funtion来声明的.如下 可以看到b在实例化为test对象以后,就可以输出test类中的属性a了.这是为什么呢? 原因在于js中的一个重要的概念:继承. 而继承的整个过程就称为该类的原型链. 在javascript中,每个对象的都有一个指向他的原型(prototype)的内部链接,这个原型对象又有它自己的原型,直到null为止 functio