Object.prototype 原型和原型链

Object.prototype 原型和原型链

原型

Javascript中所有的对象都是Object的实例,并继承Object.prototype的属性和方法,有些属性是隐藏的。换句话说,在对象创建时会存在预定义的属性,其中有一个属性就是原型对象。在函数对象中存在原型对象prototype,在普通对象中没有prototype,但存在__proto__。或者说使用function定义的对象与使用new操作符生成的对象之间有一个重要的区别,这个区别就是function定义的对象有一个prototype属性,使用new生成的对象就没有这个prototype属性,存在__proto__

var o =new Object();    
console.log(o.__proto__);
console.log(o.prototype);//undefinedvar fn = function(){} 
console.log(fn.prototype);//Object {constructor: function}
var f1 = new fn();
console.log(f1.__proto__);
console.log(f1.__proto__===fn.prototype);//true

原型链

那么__proto__是什么?每个对象都会在其内部初始化一个属性,就是__proto__
普通对象中的__proto__是什么呢? Object的本质函数对象,是通过new Function()创建,所以Object.__proto__指向Function.prototype。同理,Function也是函数对象,因此Function.__proto__同样指向Function.prototypeObject.prototype对象也有__proto__属性,但它比较特殊,为null。这个由__proto__串起来的直到Object.prototype.__proto__为null的链就是原型链。

console.log(Object.__proto__ === Function.prototype);//true
console.log(Function.__proto__===Function.prototype);//true
console.log(Object.prototype.__proto__);//null

当我们访问一个对象的属性 时,如果这个对象内部不存在这个属性,那么他就会去__proto__里找这个属性,这个__proto__又会有自己的__proto__,于是就这样 一直找下去,也就是我们平时所说的原型链的概念。参考下面的例子:

var Fn = function(){};
Fn.prototype.Hello = function(){console.log("Hello World");}
var f1 = new Fn();
f1.Hello();//Hello World

首先var f1=new fn(),f1是Fn的实例,可以得出f1.__proto__=Fn.prototype。当我们调用f1.hello()时,首先f1中没有Hello这个属性,于是,它会到他的__proto__中去找,也就是Fn.prototype,而我们在上面定义了 Fn.prototype.Hello=function(){}; 于是,就找到了对应的方法。
从一个更复杂的例子中看原型链的原理:

var Person = function() {};
Person.prototype.Name = function() {console.log("person name");
}
Person.prototype.Sex = "male or female";var Younger = function() {};
Younger.prototype = new Person();
Younger.prototype.Age = function() {console.log("14-28")
};
Younger.prototype.Sex = "female";var Ann = new Younger();
Ann.Name(); //person name
console.log(Ann.Age()); //14-28
console.log(Ann.Sex); //female

对上述代码,我们可以进行如下分析:
var Younger = function() {}===>:Younger.__proto__=Person.prototype,
Younger.prototype = new Person()===>:Younger.prototype.__proto__ = Person.prototype,
var Ann = new Younger()===>Ann.__proto__=Younger.prototype,
综上可得:
Ann.__proto__.__proto__ = Person.prototype

Ann本身没有Name()方法,于是从Ann.__proto__(Younger.prototype)中找,仍没有找到于是在向上一层Ann.__proto__.__proto__(Person.prototype)中寻找,最终在Person.prototype中找到对应的方法并调用。
同理,Ann本身并没有Age()方法,但在Ann.__proto__(Younger.prototype)存在。
对于Ann.Sex,在Ann.__proto__(Younger.prototype)中已经能够找到,便不再向上寻找,因此输出是female

转载于:https://www.cnblogs.com/Nancy-wang/p/6903221.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/392646.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

leetcode 406. 根据身高重建队列(贪心算法)

假设有打乱顺序的一群人站成一个队列。 每个人由一个整数对 (h, k) 表示,其中 h 是这个人的身高,k 是应该排在这个人前面且身高大于或等于 h 的人数。 例如:[5,2] 表示前面应该有 2 个身高大于等于 5 的人,而 [5,0] 表示前面不应该…

java和vue2.0

java中的el表达式${对象.属性}和vue中的双向数据绑定{{mode.xx}}感觉有点类似转载于:https://www.cnblogs.com/YangBinChina/p/11180460.html

oh-my-zsh官方教程

https://github.com/robbyrussell/oh-my-zsh/wiki

leetcode 134. 加油站

在一条环路上有 N 个加油站,其中第 i 个加油站有汽油 gas[i] 升。 你有一辆油箱容量无限的的汽车,从第 i 个加油站开往第 i1 个加油站需要消耗汽油 cost[i] 升。你从其中的一个加油站出发,开始时油箱为空。 如果你可以绕环路行驶一周&#…

ps怎么对比原图快捷键_PS学习之旅:ps如何制作满天星,让你夜晚的天空图片更美...

ps学习之旅,本文介绍关于如何利用ps软件来制作满天星,让你夜晚的天空图片更美,操作很简单哦。1工具/原料Adobe Photoshop CS6软件图片一张2效果展示原图:效果图:3方法/步骤(1)打开PS,选择你想要加星星的一张…

linux程序莫名异常怎么查

内存异常经常导致程序出现莫名其妙的错误,往往很难查证,本文介绍在linux下的各种常见内存异常的查证工具和方法。1 访问空指针/未初始化指针/重复释放内存对于像访问空指针、未初始化指针(非法地址),重复释放内存等内存…

永磁直驱风力发电机结构图_国内首台10MW海上永磁直驱风力发电机研制成功

2019首届新能源产业投融资论坛2019年10月25日周老师:157129595968月21日,具有完全自主知识产权、国内首台10MW海上永磁直驱风力发电机在东方电气集团东方电机有限公司研制成功,以此优异成绩向新中国成立70周年献礼。10MW海上永磁直驱风力发电…

struts2官方 中文教程 系列六:表单验证

先贴个本帖的地址,以免被爬:struts2教程 官方系列六:表单验证 即 http://www.cnblogs.com/linghaoxinpian/p/6906720.html 下载本章节代码 介绍 在本教程中,我们将探索使用Struts2来验证用户在表单上的输入。有两种方法可以来进…

Alictf 2015决赛题目设计和解题思路

解题思路: https://weibo.com/p/1001603836186467681086 设计题目: http://www.cnblogs.com/qsjmobilesec/p/4456090.html

【转载】 华为荣耀手机如何进入开发者模式

针对手机APP开发人员来说,很多时候开发手机APP应用的时候,需要进入手机的开发者模式中对程序进行调试等操作,此文将介绍华为荣耀手机如何进入开发者模式,以华为荣耀V9手机为例,华为荣耀V10、荣耀V20、华为P20、华为P30…

c++ dll 类使用_在.Net Core 中使用钩子

目录前言什么是钩子使用钩子3. 挂载多个钩子4. 在钩子中加载额外的程序集5. 在 Asp.Net Web Api 项目中使用钩子结束语演示代码下载前言Host startup hook,是2.2中提供的一项新的功能,通过使用主机启动钩子,允许开发人员在不修改代码的情况下…

3c技能和背包需要改建吗?_认为您需要仪表板? 您应该改建一个笔记本。

3c技能和背包需要改建吗?by Mahdi Karabiben通过Mahdi Karabiben 认为您需要仪表板? 您应该改建一个笔记本。 (Think you need a Dashboard? You should build a Notebook instead.) After first establishing themselves as a key component of the standard Bu…

leetcode 147. 对链表进行插入排序

对链表进行插入排序。 插入排序的动画演示如上。从第一个元素开始,该链表可以被认为已经部分排序(用黑色表示)。 每次迭代时,从输入数据中移除一个元素(用红色表示),并原地将其插入到已排好序的…

JSP过滤器Filter配置过滤类型汇总

一、配置方法1 映射过滤应用程序中所有资源<filter> <filter-name>loggerfilter</filter-name> <filter-class>myfilter.LoggerFilter</filter-class></filter><filter-mapping> <filter-name>loggerfilter</filt…

ERP流程入门_从会计分录理解企业基本流程[转]

ERP流程入门_从会计分录理解企业基本流程 本贴写给尚未在企业工作过的朋友&#xff01;了解企业的基本流程的一个方法是看它的会计分录,我们现在来看一个完整的企业基本流程&#xff0c;它的会计分录是如何做的&#xff0c;其中有些帐户名称可能不一样&#xff0c;不过没关系&a…

萨默尔机器人_助力产业发展 西安市人工智能机器人学会正式成立

8月23日&#xff0c;西安市人工智能机器人学会在西咸新区沣东新城协同创新港正式成立。西安报业全媒体记者 冯炜 摄8月23日&#xff0c;西安市人工智能机器人学会正式成立。学会将通过市场化机制、社会化服务等方式&#xff0c;整合科技创新资源和人才培养资源&#xff0c;促进…

粒度过粗_这些书帮助我度过了第一次成为技术主管的经历

粒度过粗by Danny Perez丹尼佩雷斯(Danny Perez) 这些书帮助我度过了第一次成为技术主管的经历 (These books helped me navigate my first time being a tech lead) The tech lead was moving to another team for a long-term assignment, and I took over as the engineeri…

随便说说:在ASP.NET应用程序中上传文件

在Web程序中上传文件是很常见的需求。利用HTTP协议上传文件的方式非常有限&#xff0c;最常见的莫过于使用<input type"file" />元素进行上传。这种上传方式会将内容使用multipart/form-data方案进行编码&#xff0c;并将内容POST到服务器端。使用multipart/fo…

leetcode 148. 排序链表(归并排序)

给你链表的头结点 head &#xff0c;请将其按 升序 排列并返回 排序后的链表 。 进阶&#xff1a; 你可以在 O(n log n) 时间复杂度和常数级空间复杂度下&#xff0c;对链表进行排序吗&#xff1f; 示例 1&#xff1a; 输入&#xff1a;head [4,2,1,3] 输出&#xff1a;[1…

理论与哲学就是梳理无限感性经验和知性知识的工具

理论与哲学就是梳理无限感性经验和知性知识的工具&#xff0c; 是因为人脑的特性&#xff0c;或者说人脑功能的局限性而被人创造出来的思想工具。 工具服务于实践&#xff0c;并被实践所检验&#xff08;描述、解释、预见&#xff09;。 工具一旦创建就有其客观性&#xff0c;但…