JS原型链的理解和使用(一)
一些个人的理解,不一定是对的,仅供参考。
在JS中有函数和对象两个概念,而又有一切皆对象的概念及函数也是一个对象。所以可以说函数一定可以作为一个对象,而对象不一定是一个函数。
也可以说在js中对象分为两种:1.仅仅是一个对象2.既时对象又是函数(以下称为函数对象)
在JS中有一个概念:所有对象都有__proto__属性,而函数对象则还有prototype属性,可以以此区分出哪些是函数对象
在JS中有两个顶级的内置对象:Object和Function,这两个对象我测试了都属于函数对象。但有所不同的是:Object和Function的__proto__都是ƒ () { [native code] }(native code是已被编译为特定于处理器的机器码的代码,我反正就理解为不可见的源代码),Function的prototype为ƒ () { [native code] },Object的prototype是一个对象,里面有一些自己系统自定义的方法
在JS中有一个概念:对象是由函数对象生成的,并且对象的__proto__
属性指向函数对象的prototype
属性;函数(函数对象)也是由函数(函数对象)生成的,并且生成函数(函数对象)的prototype是一个系统默认生成的对象包含了两个属性(constructor和__proto__),这个constructor指向该函数对象自身及fun.prototype.constructor===fun,而__proto__则指向Object的prototype属性即fun.prototype.__proto__===Object.prototype。(注:这里讨论生成的对象并不包含Object和Function两个顶级对象,下面会专门讨论这两个内置对象)
我们平时在直接定义对象时:var obj = {};其实还是使用Object这个顶级函数对象Object在创建对象:var obj = new Object();,这种方式生成的对象只有__proto__
属性没有prototype
属性所以只是一个对象不是函数对象,而且obj.__proto===Object.prototype。我们在定义函数(函数对象)的时候:function fun (){};其实也还是使用的顶级函数对象Function在创建函数(函数对象):var fun = new Function();,而这时生成的fun则是一个函数对象因为它既有__proto__
属性又有prototype
属性,fun.__proto__===Function.prototype,fun.prototype则是一个对象,满足上一条的生成规则,是Object的实例对象。
使用一个自己定义的函数(函数对象)来生成的对象,如:function fun(){};var obj = new fun();生成的对象只有__proto__
属性没有prototype
属性所以只是一个对象不是函数对象,obj .__proto__===fun.prototype;
当我们在创建一个函数时:function fun(){};系统会自动为该函数生成一个prototype属性,该属性的__proto__指向Object.prototype,既然Object是一个函数,那么它的prototype按照规则也应该是在生成Object函数时赋予的,并且prototype中的__proto__应该指向某一个对象,而实际上Object的prototype中的__proto__为null,这就是原型链的终点。同样Object作为一个对象有__proto__属性,该属性指向创建它的函数的prototype属性,在JS中所有函数(函数对象)都是由Function生成的,所以可以说所有函数对象的__proto__属性都相等,等于Function的prototype属性包括Object函数对象。
Function这个顶级内置的函数对象,同样有__proto__和prototype属性,Function函数对象由它自身创建,所以它的__proto__和他的prototype相等。Function的prototype同样满足所有函数的prototype的生成规则,有一个constructo指向自身,一个__proto__指向Object的prototype属性。
JS原型链的理解和使用(一)的更多相关文章
- 谈谈我对 js原型链的理解
想要学习 “原型链” 必须要认识什么是 “原型” 和 “原型链” 先理解一下普通的继承和原型的区别,下面写一段js代码来帮助理解: var Animal = function(){ // 动物抽象类 ...
- js原型链结构理解
在一般的面向对象的语言中,都存在类(class)的概念,类就是对象的模板,对象就是类的实例. 但在js中是没有类的定义的(万物皆是对象). 题外话:但是在ES6中提供了更接近传统语言的写法,引入了C ...
- JS原型链的理解和使用(二)
根据在创建对象的时候,创建出来的对象的__proto__指向创建这个对象的函数的prototype属性. 由于在调用对象的属性或者方法的时候会首先在对象的作用域中查找指定的属性或者方法,如果未找到则会 ...
- 分享一个关于js原型链的理解
http://www.cnblogs.com/wyaocn/p/5815761.html
- 深入理解JS原型链与继承
我 觉得阅读精彩的文章是提升自己最快的方法,而且我发现人在不同阶段看待同样的东西都会有不同的收获,有一天你看到一本好书或者好的文章,请记得收藏起来, 隔断时间再去看看,我想应该会有很大的收获.其实今天 ...
- 简单粗暴地理解js原型链–js面向对象编程
简单粗暴地理解js原型链–js面向对象编程 作者:茄果 链接:http://www.cnblogs.com/qieguo/archive/2016/05/03/5451626.html 原型链理解起来 ...
- js原型链理解(2)--原型链继承
1.原型链继承 2.constructor stealing(构造借用) 3.组合继承 js中的原型链继承,运用的js原型链中的__proto__. function Super(){ this.se ...
- 深入分析JS原型链以及为什么不能在原型链上使用对象
在刚刚接触JS原型链的时候都会接触到一个熟悉的名词:prototype:如果你曾经深入过prototype,你会接触到另一个名词:__proto__(注意:两边各有两条下划线,不是一条).以下将会围绕 ...
- JS 原型链图形详解
JS原型链 这篇文章是「深入ECMA-262-3」系列的一个概览和摘要.每个部分都包含了对应章节的链接,所以你可以阅读它们以便对其有更深的理解. 对象 ECMAScript做为一个高度抽象的面向对象语 ...
随机推荐
- 506,display有哪些值?说明他们的作用
block:转换成块状元素 inline:装换成行内元素 none:设置元素不可见 inline-block:想行内元素那样显示,但是其内容像块类型元素一样显示 list-item:想块类型元素一样显 ...
- PHP+Mysql防止SQL注入的方法
这篇文章介绍的内容是关于PHP+Mysql防止SQL注入的方法,有着一定的参考价值,现在分享给大家,有需要的朋友可以参考一下 方法一: mysql_real_escape_string -- 转义 S ...
- [转载]PHP开发环境 AppServ 2.5.10 安装及修改
[转载]PHP开发环境 AppServ 2.5.10 安装及修改 原文地址:PHP开发环境 AppServ 2.5.10 安装及修改 appserv下载地址:http://www.appservn ...
- 使用php-vmstat遇到的麻烦
workerman-vmstat是一个基于workerman的扩展,用于监听服务器应用对内存.cpu消耗的友好的查看功能,具体介绍可以去git上看: https://github.com/wal ...
- spring中@Component注解
1.@controller 控制器(注入服务) 2.@service 业务(注入dao) 3.@repository dao(实现dao访问) 4.@component (把普通pojo实例化到spr ...
- 公用技术——面向对象领域——UML图——《The Unified Modeling Language User Guide》V2读书笔记——第一章节(建模的意义)
第一章节到第三章节介绍UML的基本概念.第一章节主要介绍了UML语言的历史,介绍了建模的重要性(狗窝,房子,大厦),介绍了UML要实现哪些目标,在最后介绍了在使用UML语言时应该遵循的一些原则或者是规 ...
- 【jQuery基础】
" 目录 #. 介绍 1. 优势 2. 版本 3. jQuery对象 #. 查找标签 1. 选择器 /. 基本选择器 /. 层级选择器 /. 基本筛选器 /. 使用jQuery实现弹框 / ...
- 本地缓存Caffeine
Caffeine 说起Guava Cache,很多人都不会陌生,它是Google Guava工具包中的一个非常方便易用的本地化缓存实现,基于LRU算法实现,支持多种缓存过期策略.由于Guava的大量使 ...
- JS中的Boolean对象
使用new操作符和Boolean(value)构造函数时,得到的并不是原始的true或false,而是一个对象,JS将对象视为真(true) var oBooleanTrue = new Boolea ...
- Django项目配置数据库时,已安装mysqlclient,却提示 Did you install mysqlclient错误,后右报错ImproperlyConfigured: mysqlclient 1.3.13 or newer is required; you have 0.9.3
错误信息如下: 解决方案是: 找到自己的项目文件夹下的__init__.py 添加如下代码 解决这个问题后,右报错django2.2/mysql ImproperlyConfigured: mysq ...