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. Entity Framework 6 Recipes 2nd Edition(13-7)译 -> 返回只部分填充的实体

    问题 你有一个实体里的某个属性很少被读取或和更新,这个属性因为比较大,所以读取和更新都需要付很大的代价.你想有选择的放置这个属性 解决方案 假设你有一个如Figure 13-9 所示的模型 Figur ...

  2. Maven pom文件常用配置,转载

    什么是POM Project Object Model,项目对象模型.通过xml格式保存的pom.xml文件.作用类似ant的build.xml文件,功能更强大.该文件用于管理:源代码.配置文件.开发 ...

  3. datepickerx设置默认日期

    datepicher插件是jQuery UI的一个插件,它提供一个日期弹出窗口(或直接显示在页面),供用户选择日期.在Web开发中,总会遇到需要用户输入日期的情况.一般都是提供一个text类型的inp ...

  4. JSON.stringify()与JSON.parse()

    JSON.stringify()用于把一个对象解析成字符串,如 var student = { age: 23, name: 'wang' } JSON.stringify(student); 结果: ...

  5. 【兼容写法】HttpServerUtility.Execute 在等待异步操作完成时被阻止。关键词:MVC,分部视图,异步

    异常处理汇总-后端系列 http://www.cnblogs.com/dunitian/p/4523006.html MVC6之前的版本,对分部视图的异步支持不是很好 问题: 视图里面有分布视图:@{ ...

  6. Java 特定规则排序-LeetCode 179 Largest Number

    Given a list of non negative integers, arrange them such that they form the largest number. For exam ...

  7. Oracle 11.2.0.4 DataGuard 环境打PSU,OJVM PSU补丁快速参考

    环境:RHEL6.5 + Oracle 11.2.0.4 DataGuard physical standby 主库和备库都是单节点. 需求:主备库同时应用160719的PSU和OJVM PSU补丁. ...

  8. 压力测试之badboy和Jmeter的简单使用方法

    文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/ 1.背景 所谓压力测试是指,通过确定一个系统的瓶颈或者不能接收的性能点, ...

  9. struts2工作流程

    struts2的框架结构图 工作流程 1.客户端请求一个HttpServletRequest的请求,如在浏览器中输入http://localhost: 8080/bookcode/Reg.action ...

  10. java中异常抛出后代码还会继续执行吗

    今天遇到一个问题,在下面的代码中,当抛出运行时异常后,后面的代码还会执行吗,是否需要在异常后面加上return语句呢? public void add(int index, E element){ i ...