`
lukejin
  • 浏览: 362078 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Javascript原型链研究

阅读更多

前言:如果想深入理解Javascript的面向对象编程思想,那么对于原型链的理解将十分重要,由于看了李战老师的<悟透Javascript>,产生了很多疑问,于是带着疑问在网络上查找答案,也翻出了Ecma-262来看了,总算明白了一些东西。

 

一.类别和对象


在Javascript没有所谓的其他高级语言中的”类”的概念,

 

所有的”数据”除了基本“类型” 便是对象Object(普通对象object和函数对象function) .

如果从集合论的角度在思考问题,我们可以将所有的这些数据进行分类,那么可以得到如下几类:

Undefined,Null,Boolean,Number,String还有Object

所有的基本数据类型必定属于前面五种类型(Type)之一,而复杂的数据类型只有Object一种.

我们可以举例说明一下,


Undefine={undefined}

Null={null}

Boolean={true,false}

Number={0,1,2,0.1……}

String={’a',’b',’123′,…}

Object={{a:1},function f(){},…}

以上的只是简单的说明,并不严谨.

有了以上的说明我们再来看typeof这个运算符

其实typeof就是根据上面的这些类型来判断并返回结果的



 

二.内建对象(Build-in Object)


在Javascript语言中有一些内建对象(他们的typeof值为function),其中有Global,Object,Function,Array,String,Boolean,Number,Math,Date,RegExp(注意这里和上面所讲的“类别”是两码事)还有一些其他的错误类,这里暂不一一列举.这些内建对象其实都是构造器,或者说它们都是函数.这里我们可以通过new运算符创建相应的对象.如

 

var s = new String(’string’);这样得到的是一个字符串对象 ,typeof s 是”object”

 

而如果没有使用new而是var s=String(’string’);得到的是一个基本类型字符串 ,typeof s得到的是”string”

 

 

 

三.原型Prototype


由于Javascript中没有类,那通过什么来实现面向对象中的继承呢,对,就是原型,原型本身也是对象.

每一个对象都有一个隐式的原型(父原型),而函数对象除了隐式的原型引用外,还有一个显式的原型引用。

在一般情况下,对象的隐式原型是不可以访问的,而函数对象的显式原型可以通过 FunctionName.prototype进行访问,

但在Firefox中你可以通过对象的__proto__属性访问对象的隐式原型。

说了这么多,你可以还是对这两种原型没有理解,我们举个例子吧。

function Person(name){
this.name=name;
}
alert(Person.prototype);
alert(Person.prototype.constructor);
alert(Person.__proto__===Function.prototype);
alert(Person.constructor);
 
var p = new Person('Luke');
alert(p.prototype);
alert(p.__proto__===Person.prototype);
alert(p.constructor);
 

 

运行上面的代码我们可以知道,Person这个函数他的显式原型是一个object对象,而这个原型对象的构造器就是Person自己。

我们又可以知道这个函数的哦隐式原型是内置对象Function的显式原型,且我们可以知道Person的构造器是Function函数。

接着我又创建了一个对象p,可以知道如果直接使用prototype是无法访问的,结果为undefined,因为p是一个普通对象,只能在Firefox中通过__proto__来访问其隐式的原型,可以知道其隐式的原型为Person的显式原型。

我这里就很武断的得出一个结论来,当然不一定正确。

一个创建的对象,如果不主动的修改其隐式的原型(当然我们无法修改),那么默认的隐式原型为其constructor的显式原型。

 

四.原型链

在原型链中Javascript内置的两个初始化函数对象尤为重要,一个就是Function,一个是Object。

 

 

 

 

写道
Function.__proto__===Function.prototype(其值都是一个匿名的空函数 function(){},我们暂称之为f)
f.__proto__为一普通object  f.__proto__.__proto__===Object.prototype
f.prototype 也为一普通object  f.prototype .__proto__===Object.prototype
Object.prototype为原型链的终点   Object.prototype.__proto__ ===null
Object是一个初始化函数对象 Object.__proto__===Function.prototype

 

下面是一个内建对象原型链的大概图示。


 

ECMA262规定了一些既定的规则,没有原因,只是为了实现某种目的且自圆其说。

 

 

 

  • 大小: 36.3 KB
  • 大小: 37.1 KB
6
1
分享到:
评论
7 楼 zx848 2012-09-24  
所有的”数据”除了基本“类型” 便是对象Object(普通对象object和函数对象function)
我记得js中所有数据都是对象
例如:
alert((10).toString());是可执行的
6 楼 laijinyan 2012-08-29  
laijinyan 写道
f.prototype 也为一普通object  f.prototype .__proto__===Object.prototype

好像不对
f.prototype 为 undefined



运行环境为 chrome 的 v8 引擎
5 楼 laijinyan 2012-08-29  
f.prototype 也为一普通object  f.prototype .__proto__===Object.prototype

好像不对
f.prototype 为 undefined
4 楼 一个人旅行 2011-03-04  
受教了。非常好的总结。
3 楼 lukejin 2010-07-12  
silasoni 写道
这样的图 用什么工具画呢 

omnigraffle  mac下的软件
2 楼 silasoni 2010-07-12  
这样的图 用什么工具画呢 
1 楼 lukejin 2010-02-05  
去年写的啦,当时还画了个图的,不见了 ,杯具。

相关推荐

    详解Javascript中的原型OOP

    JavaScript原型链对于对于很多刚学习Javascript的新手们来书总显得神秘不好理解,但如果你想深入的学习Javascript,就不得不去研究以下了,或许你很少有机会来使用它,不过我想说机会总是留给有准备的人,下面我们这...

    单页Web应用:JavaScript前端到后端--源代码

    单页Web应用:JavaScript前端到后端的源码下载,提供了全部的源代码供javascript及前端爱好者们研究...新增了第二章javascript知识温故代码,主要有类与原型,作用域、原型链、运行环境、函数和闭包的定义和实例使用。

    JonasJavascript2021:完整JavaScript课程2021

    现代OOP:类,构造函数,原型继承,封装等。 异步JavaScript:事件循环,承诺,异步/等待,AJAX调用和API 2020年及以后的现代工具:NPM,Parcel,Babel和ES6模块 如何像开发人员一样思考和工作:问题解决,研究,...

    JS-Advanced-January-2021:Softuni JavaScript高级课程的每个实验和练习家庭作业。 2021年1月

    将考虑JavaScript编程的功能性和OOP方法,并将研究诸如继承,对象组成和原型链之类的概念。+ Environment Specifics# Please, be aware that every JS environment may behave differently when executing code. # ...

    javaweb开发源码-javascript_the_weird_parts:Javascript是现代开发人员需要知道并且非常了解的语言。真

    本课程将涵盖高级概念,例如对象和对象文字,函数表达式,原型继承,函数编程,作用域链,函数构造函数(以及新的ES6功能),立即调用的函数表达式(IIFE),调用,应用,绑定等。 我们将深入研究诸如jQuery和...

    JavaScript-Advanced:这些是本学期我解决的一些问题

    将对JavaScript编程的功能和OOP方法进行回顾,并对诸如继承,对象组成和原型链之类的概念进行研究。 关于提出的解决方案 在大学的法官测试系统中,每个解决方案都是100/100,这意味着它们都是正确的。 随着第一个...

    javascript中有趣的反柯里化深入分析

    我们想要的,其实只是借用Array原型链上的一些函数。并没有必要去显式的构造一个新的函数来改变它们的参数并且重新运算。 如果用uncurrying的方式显然更加优雅和美妙,就像这样: 还能做很多有趣和方便的事情

    webfex:网络 fex 研究

    数据类型、面向对象、继承、闭包、插件、作用域、跨域、原型链、模块化、自定义事件、内存泄漏、事件机制、异步装载回调、模板引擎、Nodejs、JSON、ajax等。 NodeJS: 对Node的优点和缺点提出了自己的看法? NodeJS...

    LearningSecurity

    SQL注入宽字节注入DOS版重做慢速HTTP正则表达式盲注文件上传反映文件下载拉链炸弹CRLFCSRFSSRF罪行投毒拒绝服务HTTP请求走私WebShell的MISC作业系统提权命令注入JavaScript原型污染Java表达式注入OGNL注入Spel表达式...

    routing-libs-study:该存储库研究并比较了单页应用程序的不同微路由库

    路由库研究 该存储库研究并比较了单页应用程序的不同微路由库 介绍 该原型包含一组分别使用以下流行微路由库实现单页应用程序路由功能的原型: 路由器.js 页面.js 导演.js Crossroads.js //TODO 所有 protos 都...

    rda-lod:用于元数据IG的研究数据联盟链接开放数据项目

    该项目目前处于原型阶段。 我创建了将元数据提取到MongoDB数据库中的功能。 我从ICPSR元数据中提取“正常”字段,然后对其进行“标准化”。 到目前为止,我们已经提取了title字段,可以直接从其原始格式中使用它,并...

    CancerExplorer

    C ancer E XPLORER原型 链接的基于数据的空间因果关系浏览器 介绍 该项目处理与癌症相关的因果关系。 此外,其目的是创建一个基于Web的辅助系统,用于探索预定义地理区域中所选癌症类型的因果关系。 该项目是一部分...

    interaction-design:交互设计。 可重用的 React 组件

    五个组成部分得到了研究、指南评估、设计原型、编码、截屏视频和个人反思的支持。 您还可以通过单击托管页面底部的链接查看所有 9 个组件。 编码 截屏 反射 3. 移动导航 研究 评估指南 规划和设计原型 编码 截屏 ...

    frontend-checklist:成为现代前端开发人员的技能和任务的完整待办事项清单

    在关注我 用法只需研究每个主题并检查完成即可 :check_mark_button: 。 对于任务,请完成任务并将链接放在任务说明的右侧。 所以像这样- 创建一个使用GitHub Repositories API来获取和显示本周前十大存储库的网页,...

    ethrelay:以太坊智能合约,可以以不信任和分散的方式验证不同``验证''区块链上的``目标''区块链的交易

    重要提示:ETH Relay是研究原型。 它代表了研究项目中正在进行的工作。 小心使用。 开始使用 通过随附的go-ethrelay CLI工具,可以最好地使用ETH Relay,该工具可在找到。 但是,如果要手动部署合同,请执行以下...

    stockmeister-server:StockMeister的后端

    研究市场并开始进行简单交易可能是一个很好的起点。 通常,当您不得不放下自己的钱时,这似乎令人生畏。 那就是StockMeister进来的地方! StockMeister的主要优点是,我们可以让您在潜入水中之前先进行水域测试。...

    NVScene2014.ProcGenContent:NVScene 2014 Talk 笔记和代码示例

    自述文件/演示研究笔记 演讲目标 我们将探索一系列程序内容生成技术,并了解如何使用 GPGPU 技术来提高其性能。 计划 理论:PCG 历史、概念和应用 在游戏中使用 康威的人生游戏。 (1970) 精英,黄金七城,哨兵。 ...

    ke-canvas:HS-Mainz K + E数码画布SS 2015

    教学形式: 研讨会,讲习班资格目标: 当前网络技术概述学习原型实施策略通过Web开发手段实施设计思想通过Web开发工具和工作流获得实践经验评估和评估网络中的创新课程负责人: 斯蒂芬·阿蒙(Stefan Ammon)时间: ...

    HealthNote---IBM-Watson:IBM Watson 认知计算 API

    17 页商业模式和原型的执行摘要,以 pdf 格式链接在这里 Healthnote 是我们创建的,并将呈现给 IBM。 以下是技术部分的描述: ======================== 我们想要做什么 我们希望洞察汇总世界上所有新兴的研究成果...

    asp.net知识库

    完整的在.net后台执行javascript脚本集合 ASP.NET 中的正则表达式 常用的匹配正则表达式和实例 经典正则表达式 delegate vs. event 我是谁?[C#] 表达式计算引擎 正式发布表达式计算引擎WfcExp V0.9(附源码) 运算...

Global site tag (gtag.js) - Google Analytics