JS原型链
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原型链的更多相关文章
- 深入分析JS原型链以及为什么不能在原型链上使用对象
在刚刚接触JS原型链的时候都会接触到一个熟悉的名词:prototype:如果你曾经深入过prototype,你会接触到另一个名词:__proto__(注意:两边各有两条下划线,不是一条).以下将会围绕 ...
- js原型链与继承(初体验)
js原型链与继承是js中的重点,所以我们通过以下三个例子来进行详细的讲解. 首先定义一个对象obj,该对象的原型为obj._proto_,我们可以用ES5中的getPrototypeOf这一方法来查询 ...
- JS 原型链图形详解
JS原型链 这篇文章是「深入ECMA-262-3」系列的一个概览和摘要.每个部分都包含了对应章节的链接,所以你可以阅读它们以便对其有更深的理解. 对象 ECMAScript做为一个高度抽象的面向对象语 ...
- 深入理解JS原型链与继承
我 觉得阅读精彩的文章是提升自己最快的方法,而且我发现人在不同阶段看待同样的东西都会有不同的收获,有一天你看到一本好书或者好的文章,请记得收藏起来, 隔断时间再去看看,我想应该会有很大的收获.其实今天 ...
- js 原型链和继承(转)
在理解继承之前,需要知道 js 的三个东西: 什么是 JS 原型链 this 的值到底是什么 JS 的 new 到底是干什么的 1. 什么是 JS 原型链? 我们知道 JS 有对象,比如 var ob ...
- 一张图看懂 JS 原型链
JS 原型链,画了张图,终于理清楚各种关系有木有 写在最后: __proto__是每个对象都有的一个属性,而prototype是函数才会有的属性!!! function Person() { } 是函 ...
- 简单粗暴地理解js原型链–js面向对象编程
简单粗暴地理解js原型链–js面向对象编程 作者:茄果 链接:http://www.cnblogs.com/qieguo/archive/2016/05/03/5451626.html 原型链理解起来 ...
- JS原型链与继承别再被问倒了
原文:详解JS原型链与继承 摘自JavaScript高级程序设计: 继承是OO语言中的一个最为人津津乐道的概念.许多OO语言都支持两种继承方式: 接口继承 和 实现继承 .接口继承只继承方法签名,而实 ...
- 02 js原型链
1 js原型链是一个绕不开的话题.直接上说吧. /** * 1. js里的原型链是怎么样的? 带class 和不带class的原型链的不同. */ const util = require('util ...
随机推荐
- 在ASP.NET MVC5中实现具有服务器端过滤、排序和分页的GridView
背景 在前一篇文章<[初学者指南]在ASP.NET MVC 5中创建GridView>中,我们学习了如何在 ASP.NET MVC 中实现 GridView,类似于 ASP.NET web ...
- Python3 登陆网页并保持cookie
网页登陆 网页登陆的原理都是,保持一个sessionid在cookie然后,根据sessionid在服务端找到cookie进行用户识别 python实现 由于python的简单以及丰富的类库是开发网络 ...
- PHP安装mysql.so扩展
在PHP中mysql_connect模块已经逐渐被弃用,我在搭建环境时也没有再安装mysql扩展,但是今天在维护一个老项目时,出现报错 Fatal error: Uncaught Error: Cal ...
- 在PC上测试移动端网站和模拟手机浏览器的5大方
查了很多资料,尝试了大部分方法,下面将这一天的努力总结下分享给大家,也让大家免去看那么多文章,以下介绍的方法,都是本人亲自测试成功的方法,测试环境winxp. 一.Chrome*浏览器 chrome模 ...
- ASP.NET MVC5+EF6+EasyUI 后台管理系统(17)-LinQ动态排序
系列目录 首先修复程序中的一个BUG这个BUG在GridPager类中,把sord修改为sort这个名称填写错误,会导致后台一直无法获取datagrid的排序字段 本来是没有这一讲的,为了使20行的代 ...
- ASP.NET MVC5+EF6+EasyUI 后台管理系统(48)-工作流设计-起草新申请
系列目录 创建新表单之后,我们就可以起草申请了,申请按照严格的表单步骤和分支执行. 起草的同时,我们分解流转的规则中的审批人并保存,具体流程如下 接下来创建DrafContoller控制器,此控制器只 ...
- springMVC+ajax 文件上传 带进度条
前端代码: <form id= "uploadForm"> <p >指定文件名: <input type="text" name= ...
- PPT转化成Image、PPTX、XPS、EMF
最近工作经常用到演示文稿,接触到了一款不错的免费软件—Free Spire.Presentation.使用之后发现这款软件非常轻巧,功能还挺齐全.这款软件的转化功能也是非常不错的,平时遇到的各种转换难 ...
- STM32 NVIC配置详解
例程: /* Configure one bit for preemption priority */ NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1) ...
- 查看Sql Server被锁的表以及解锁
查看被锁表: select spId from master..SysProcesses where db_Name(dbID) = '数据库名称' and spId <> @@SpId ...