JS作为发展了多年了对象语言,支持继承,和完全面向对象语言不同的是,JS依赖原型链来实现对象的继承。

首先JS的对象分两大类,函数对象和普通对象,每个对象均内置__proto__属性,在不人为赋值__proto__的前提下,普通__proto__属性指向其构造函数的.prototype属性,例如:

var test={};

此时test.__proto__指向Object.prototype,Object为原型链的顶端,一切对象均可追朔到Object.

function money(){};

var test=new money();

此时test.__proto__指向money.prototype.

普通对象没有prototype属性。(Object除外)

再来看函数对象:

function money(){};

此时money是一个函数对象,其__proto__指向Function.prototype

Function.prototype也是一个普通对象,又回到了上面所说的,所以Function.prototype中的__proto__属性指向Object.prototype。

这里只需记住一点,一切对象均有__proto__属性,一切对象继承链顶端都是Object对象,那么Object.prototype.__proto__又指向哪里呢?

console.log(Object.prototype.__proto__)

//null

即顶端的对象不再继承任何对象,他的父级是空。

既然知道了JS原型链,再一起来了解实际项目中的应用

这里我们定义了一个函数对象

var father=funcion(){};

var son=new father();

var son1=new father();

这里我们获得了两个普通对象son,son1

两个普通对象的__proto__均指向father.prototype,因为他们都是由father函数对象构造出来的。

如果这时我们需要为son增加一个属性,我们可以这么写

son.say=function(){alert(‘hello world!’)}

son.say();

//hello world!

当然没问题,如果我们需要son1也有同样的属性呢,son1.say=function(){alert(‘hello world!’)}

son1.say();

//hello world!

代码没有任何问题,运行良好。

如果我们用father构造了很多对象,son1,son2.....son10000,这是我们需要这些构造出来的对象都有这个属性该怎么办!

father.prototype.say=function(){alert(‘hello world!’)}

var son1000=new father();

son1000.say();

//hello world!

我们没有为son1000添加任何属性方法,但它依然可以正常运行。

来看原理:

JS约定在获取对象内置属性时,首先会去当前对象中寻找,如果找不到,则去.__proto__所指向的对象中去寻找,由于.__proto__所指向的对象本身也有.__proto__属性,所以如果没有找到则继续根据当前对象.__proto__所指向的对象去继续寻找,在整个过程中,如果找到则终止继续向上查询,否则一直会追踪到Object.prototype,如果整条链上均没有找到,那么结果就是undefined!

JS原型链的更多相关文章

  1. 深入分析JS原型链以及为什么不能在原型链上使用对象

    在刚刚接触JS原型链的时候都会接触到一个熟悉的名词:prototype:如果你曾经深入过prototype,你会接触到另一个名词:__proto__(注意:两边各有两条下划线,不是一条).以下将会围绕 ...

  2. js原型链与继承(初体验)

    js原型链与继承是js中的重点,所以我们通过以下三个例子来进行详细的讲解. 首先定义一个对象obj,该对象的原型为obj._proto_,我们可以用ES5中的getPrototypeOf这一方法来查询 ...

  3. JS 原型链图形详解

    JS原型链 这篇文章是「深入ECMA-262-3」系列的一个概览和摘要.每个部分都包含了对应章节的链接,所以你可以阅读它们以便对其有更深的理解. 对象 ECMAScript做为一个高度抽象的面向对象语 ...

  4. 深入理解JS原型链与继承

    我 觉得阅读精彩的文章是提升自己最快的方法,而且我发现人在不同阶段看待同样的东西都会有不同的收获,有一天你看到一本好书或者好的文章,请记得收藏起来, 隔断时间再去看看,我想应该会有很大的收获.其实今天 ...

  5. js 原型链和继承(转)

    在理解继承之前,需要知道 js 的三个东西: 什么是 JS 原型链 this 的值到底是什么 JS 的 new 到底是干什么的 1. 什么是 JS 原型链? 我们知道 JS 有对象,比如 var ob ...

  6. 一张图看懂 JS 原型链

    JS 原型链,画了张图,终于理清楚各种关系有木有 写在最后: __proto__是每个对象都有的一个属性,而prototype是函数才会有的属性!!! function Person() { } 是函 ...

  7. 简单粗暴地理解js原型链–js面向对象编程

    简单粗暴地理解js原型链–js面向对象编程 作者:茄果 链接:http://www.cnblogs.com/qieguo/archive/2016/05/03/5451626.html 原型链理解起来 ...

  8. JS原型链与继承别再被问倒了

    原文:详解JS原型链与继承 摘自JavaScript高级程序设计: 继承是OO语言中的一个最为人津津乐道的概念.许多OO语言都支持两种继承方式: 接口继承 和 实现继承 .接口继承只继承方法签名,而实 ...

  9. 02 js原型链

    1 js原型链是一个绕不开的话题.直接上说吧. /** * 1. js里的原型链是怎么样的? 带class 和不带class的原型链的不同. */ const util = require('util ...

随机推荐

  1. ABP框架 - 验证数据传输对象

    文档目录 本节内容: 简介 使用数据注解 自定义验证 禁用验证 正常化 简介 一个应用的输入应当先要验证,这个输入可能来自用户或另一个应用,在一个web应用里,验证通常实现两次:在客户端和在服务端,客 ...

  2. 在春意盎然的季节里初识GIT

    Git 与 SVN 区别 GIT不仅仅是个版本控制系统,它也是个内容管理系统(CMS),工作管理系统等. 如果你是一个具有使用SVN背景的人,你需要做一定的思想转换,来适应GIT提供的一些概念和特征. ...

  3. 【原】关于Python中setuptools安装的问题

    在生成package的时候,需要在setup.py中引入setuptools包,可是却报告如下错误: ImportError: No module named setuptools 解决办法就是下载s ...

  4. (实例篇)php 使用redis锁限制并发访问类示例

    1.并发访问限制问题 对于一些需要限制同一个用户并发访问的场景,如果用户并发请求多次,而服务器处理没有加锁限制,用户则可以多次请求成功. 例如换领优惠券,如果用户同一时间并发提交换领码,在没有加锁限制 ...

  5. javascript继承的三种模式

    javascript继承一般有三种模式:组合继承,原型式继承和寄生式继承: 1组合继承:javascript最为广泛的继承方式通过原型链实现对原型属性和方法的继承,通过构造函数实现对实例属性的继承,同 ...

  6. SQL Server 即时文件初始化

    一.本文所涉及的内容(Contents) 本文所涉及的内容(Contents) 背景(Contexts) 基础知识(Rudimentary Knowledge) 实现过程(Process) 疑问(Qu ...

  7. VMware-存储断网之后无法添加vmx到清单

    由于发生了单点故障,笔者最近处理了一个case,其中一些经验非常希望和大家分享. 问题原因: Technorati 标签: VMware,虚拟机,vmx,锁定,干货 某环境使用VMware的ESXi5 ...

  8. Vertica 导出数据测试用例

    需求:构建简单的测试用例,完成演示Vertica导出数据的功能. 测试用例:导出test业务用户t_jingyu表中的数据. 一.初始化测试环境 二.导出数据 2.1 vsql命令说明帮助 2.2 导 ...

  9. ASP.NET MVC5中的Model验证

    Model验证是ASP.NET MVC中的重要部分,它主要用于判断输入的数据类型及值是否符合我们设定的规则,这篇文章就介绍下ASP.NET MVC中Model验证的几种方式. 后台验证 DataAnn ...

  10. android权限

    一.WebView 访问internet 的权限: 1.在layout中增加一个WebView 控件: <WebView android:layout_width="match_par ...