深入浅出理解javaScript原型链

   这篇文章主要介绍了对javaScript原型链的理解,以实例形式对javaScript原型链的概念及相关使用技巧做了较为浅显易懂的分析,需要的朋友可以参考下

  本文实例讲述了javaScript的原型链。分享给大家供大家参考。具体分析如下:

  对于javascript原型链,以前都觉得是个很深的东西,一直没有理解很明白,今天看了一些介绍后,发现这张图,表示再没有什么语言能比这张图说得清楚了。

  看了这张图后突然对javascript有了质的理解。


  javascript的原型链有显式和隐式两种:

  显式原型链:即我们常见的prototype;

  隐式原型链:在一般环境下无法访问,即不可见,在FireFox下可以通过__proto__方式访问;隐式原型链用于javascript引擎内部对原型链的搜寻,通过显示原型链来设置;

  一、prototype和__proto__的概念

  prototype是函数的一个属性(每个函数都有一个prototype属性),这个属性是一个指针,指向一个对象。它是显示修改对象的原型的属性。

  __proto__是一个对象拥有的内置属性(请注意:prototype是函数的内置属性,__proto__是对象的内置属性),是JS内部使用寻找原型链的属性。

  用chrome和FF都可以访问到对象的__proto__属性,IE不可以。

  二、new 的过程

  ?

1
2

var Person = function(){};
var p = new Person();

  new的过程拆分成以下三步:

  (1) var p={}; 也就是说,初始化一个对象p

  (2) p.__proto__ = Person.prototype;

  (3) Person.call(p); 也就是说构造p,也可以称之为初始化p

  关键在于第二步,我们来证明一下:

  ?

1
2
3

var Person = function(){};
var p = new Person();
alert(p.__proto__ === Person.prototype);

  这段代码会返回true。说明我们步骤2是正确的。

  三、示例

  ?

1
2
3
4
5
6
7

var Person = function(){};
Person.prototype.sayName = function() {
alert("My Name is Jacky");
};
Person.prototype.age = 27;
var p = new Person();
p.sayName();

  p是一个引用指向Person的对象。我们在Person的原型上定义了一个sayName方法和age属性,当我们执行p.age时,会先在this的内部查找(也就是构造函数内部),如果没有找到然后再沿着原型链向上追溯。

  这里的向上追溯是怎么向上的呢?这里就要使用__proto__属性来链接到原型(也就是Person.prototype)进行查找。最终在原型上找到了age属性。

  希望本文所述对大家的javascript程序设计有所帮助。

时间: 2025-01-27 01:46:18

深入浅出理解javaScript原型链的相关文章

深入浅出理解javaScript原型链_javascript技巧

本文实例讲述了javaScript的原型链.分享给大家供大家参考.具体分析如下: 对于javascript原型链,以前都觉得是个很深的东西,一直没有理解很明白,今天看了一些介绍后,发现这张图,表示再没有什么语言能比这张图说得清楚了. 看了这张图后突然对javascript有了质的理解. javascript的原型链有显式和隐式两种: 显式原型链:即我们常见的prototype: 隐式原型链:在一般环境下无法访问,即不可见,在FireFox下可以通过__proto__方式访问:隐式原型链用于jav

理解JavaScript原型链_javascript技巧

每一个JavaScript对象都和另一个对象相关联,相关联的这个对象就是我们所说的"原型".每一个对象都会从原型继承属性和方法.有一个特殊的对象没有原型,就是Object.在之后的图示中会进行说明. 举个栗子,我们首先声明一个函数Student(): function Student(name){ this.name = name; this.hello = function(){ alert(`Hello,${this.name}`); } } 这个函数包含一个属性name和一个方法

深入理解javascript原型链和继承_javascript技巧

在上一篇文章中,介绍了原型的概念,了解到在javascript中构造函数.原型对象.实例三个好基友之间的关系:每一个构造函数都有一个"守护神"--原型对象,原型对象心里面也存着一个构造函数的"位置",两情相悦,而实例呢却又"暗恋"着原型对象,她也在心里留存了一个原型对象的位置. javascript本身不是面向对象的语言,而是基于对象的语言,对于习惯了其他OO语言的人来说,起初有些不适应,因为在这里没有"类"的概念,或者说&q

深入理解javascript原型链和继承

 javascript本身不是面向对象的语言,而是基于对象的语言,对于习惯了其他OO语言的人来说,起初有些不适应,因为在这里没有"类"的概念,或者说"类"和"实例"不区分,更不要指望有"父类"."子类"之分了.那么,javascript中这一堆对象这么联系起来呢? 幸运的是,javascript在设计之初就提供了"继承"的实现方式,在认识"继承"之前,我们现在先来了解

简单粗暴地理解 JavaScript 原型链

原型链理解起来有点绕了,网上资料也是很多,每次晚上睡不着的时候总喜欢在网上找点原型链和闭包的文章看,效果极好. 不要纠结于那一堆术语了,那除了让你脑筋拧成麻花,真的不能帮你什么.简单粗暴点看原型链吧,想点与代码无关的事,比如人.妖以及人妖. 1)人是人他妈生的,妖是妖他妈生的.人和妖都是对象实例,而人他妈和妖他妈就是原型.原型也是对象,叫原型对象. 2)人他妈和人他爸啪啪啪能生出一堆人宝宝.妖他妈和妖他爸啪啪啪能生出一堆妖宝宝,啪啪啪就是构造函数,俗称造人. 3)人他妈会记录啪啪啪的信息,所以可

关于JavaScript 原型链的一点个人理解_基础知识

JavaScript借鉴了许多语言的特点:例如语法类Java.函数借鉴Scheme.原型继承借鉴自Self.正则表达式借鉴于Perl.(DC Javascript:语言精粹).      首先,每个JS是一门基于原型继承的面向对象的语言.里面数组是对象.函数是对象."对象"当然还是对象.而且每个对象都有一个internal slot[[prototype]],这才是原型链连接起来的关键.诚然,我们可以为一个对象设置prototype property,但这又怎么样呢,这只是表象:后面暗

JavaScript原型链示例分享

 这篇文章主要介绍了JavaScript原型链示例,有需要的朋友可以参考一下    代码如下: <mce:script type="text/javascript"><!-- /*    每个对象实例都有个属性成员用于指向到它的instanceof 对象(暂称为父对象)的原型(prototype)    我们把这种层层指向父原型的关系称为[原型链 prototype chian]    原型也具有父原型,因为它往往也是一个对象实例,除非我们人为地去改变它    在Ja

浅谈javascript原型链与继承_javascript技巧

js原型链与继承是js中的重点,所以我们通过以下三个例子来进行详细的讲解.       首先定义一个对象obj,该对象的原型为obj._proto_,我们可以用ES5中的getPrototypeOf这一方法来查询obj的原型,我们通过判断obj的原型是否与Object.prototype相等来证明是否存在obj的原型,答案返回true,所以存在.然后我们定义一个函数foo(),任何一个函数都有它的prototype对象,即函数的原型,我们可以在函数的原型上添加任意属性,之后通过new一个实例化的

Javascript原型链的原理详解_javascript技巧

本文实例分析了Javascript原型链的原理.分享给大家供大家参考,具体如下: 一.JavaScript原型链 ECMAScript中描述了原型链的概念,并将原型链作为实现继承的主要方法.其基本思想是利用原型让一个引用类型继承另一个引用类型的属性和方法.在JavaScript中,用 __proto__ 属性来表示一个对象的原型链.当查找一个对象的属性时,JavaScript 会向上遍历原型链,直到找到给定名称的属性为止! 比如现在有如下的代码: 扩展Object类,添加Clone和Extend