> * js里所有的对象都有**proto**属性(对象,函数),指向构造该对象的构造函数的原型。
> * 只有函数function才具有prototype属性。这个属性是一个指针,指向一个对象,这个对象的用途就是包含所有实例共享的属性和方法(我们把这个对象叫做原型对象)。原型对象也有一个属性,叫做constructor,这个属性包含了一个指针,指回原构造函数。
要理解原型和原型链首先要知道几个概念:
①、在js里,继承机制是原型继承。继承的起点是 对象的原型(Object prototype)。
②、一切皆为对象,只要是对象,就会有 proto 属性,该属性存储了指向其构造的指针。
Object prototype也是对象,其 proto 指向null。
③、对象分为两种:函数对象和普通对象,只有函数对象拥有『原型』对象(prototype)。
prototype的本质是普通对象。
Function prototype比较特殊,是没有prototype的函数对象。
new操作得到的对象是普通对象。
④、当调取一个对象的属性时,会先在本身查找,若无,就根据 proto 找到构造原型,若无,继续往上找。最后会到达顶层Object prototype,它的 proto 指向null,均无结果则返回undefined,结束。
⑤、由 proto 串起的路径就是『原型链』。
### 三句话总结原型和原型链
> 第一句话:`prototype`是函数的原型对象,即`prototype`是一个对象,它会被对应的`__proto__`引用。
> 第二句话:要知道自己的`__proto__`引用了哪个`prototype`,只需要看看是哪个构造函数构造了你,那你的`__proto__`就是那个构造函数的`prototype`。
> 第三句话:所有的构造函数的原型链最后都会引用`Object`构造函数的原型,即可以理解Object构造函数的原型是所有原型链的最底层,即`Object.prototype.__proto===null`
**以下试题帮助您加深理解**
## 第一道:
~~~
Object.__proto__ === ????填空???? // 为 true
~~~
求`Object.__proto__`,首先你要知道`Object`是什么数据类型,他是一个构造函数,也就是一个函数,来复习一下我们的第二句话,函数由哪个构造函数构造出来?那不是废话吗,当然是`Function`,因此很明显,答案就是:
~~~
Object.__proto__ === Function.prototype // 为 true
~~~
## 第二道:
~~~
Function.__proto__ === ????填空???? // 为 true
~~~
求`Function.__proto__`,一样,你要先清楚`Function`是什么数据类型,他同样是一个构造函数,是来用来创建(构造)一个函数的构造函数(- -!有点拗口),所以同样的,用我们的第二句话即可解决,这个构造函数同样是函数,因此答案就是:
~~~
Function.__proto__ === Function.prototype // 为 true
~~~
## 第三道:
~~~
true.__proto__ === ????填空???? // 为 true
~~~
求`true.__proto__`,有没有感觉是换汤不换药,`true`是什么数据类型,`Boolean`嘛,因此它是由构造函数`Boolean`构造出来的,所以答案显而易见:
~~~
true.__proto__ === Boolean.prototype // 为 true
~~~
## 第四道:
~~~
Function.prototype.__proto__ === ????填空???? // 为 true
~~~
求`Function.prototype.__proto__`,好了,这里需要第一句话和第二句话一起用了,首先根据第一句话,`prototype`是一个对象,然后根据第二句话,那么既然它是一个对象,他的构造函数很明显就是`Object`,因此答案也呼之欲出了:
~~~
Function.prototype.__proto__ ===Object.prototype // 为 true
~~~
## 第五道:
~~~
function Test(){}
var test=new Test()
test.__proto__===????填空???? // 为 true
~~~
对于自己写的构造函数,这三句话依然有效,因此答案也很容易就得出来了:
~~~
test.__proto__===Test.prototype // 为 true
~~~
## 最后一道,必须谨记的例外:
~~~
Object.prototype.__proto__===null
~~~
- 前端综合问题
- 【01】工作中你是如何检测浏览器兼容问题的?
- 【02】手机端怎么适配?
- 【03】你对手机平台安装包后缀的理解
- 【04】你所了解的Web攻击技术
- 【05】如何防止XSS攻击?
- 【06】项目开发过程中都用过什么框架?
- 【07】一般情况下,端口号的取值范围是多少?
- 【08】简述http常见的状态码及含义
- 【09】CommonJS,AMD,CMD区别
- 【10】Svn与Git的区别
- 【11】http请求方式有几种?分别是什么?
- 【12】请你谈谈cookie的弊端?
- 【13】window对象常用的属性和方法有那些
- 【14】你有哪些性能优化的方法?
- 【15】web页面重构怎么操作?
- 【16】线程与进程的区别是什么?
- 【17】什么是WEB标准?什么是W3C标准?
- 【18】行内元素有哪些? 块级元素有哪些? CSS的盒模型?
- 【19】你如何优化自己的代码?
- 【20】如何实现浏览器内多个标签页之间的通信?
- 【21】请谈一下你对网页标准和标准制定机构重要性的理解
- 【22】浏览器是如何渲染页面的
- 【23】从输入url到显示页面,都经历了什么
- 【24】谈谈垃圾回收机制方式及内存管理
- 【25】请解释JSONP的工作原理,以及它为什么不是真正的AJAX
- 【26】http 和 https 有何区别?如何灵活使用?
- 【27】浏览器缓存有哪些,通常缓存有哪几种
- 【28】xml和json的区别
- 手写代码及阅读题
- 【01】计算1-10000中出现的0 的次数
- 【02】写一个兼容的function,清除字符串前后的空格
- 【03】请对一个数组的数组从小到大进行排序
- 【04】以下代码输出什么[空函数返回值]
- 【05】下面代码输出什么?[各种类型拼接]
- 【06】常用的两种函数声明有什么区别?
- 【07】请计算一个对象的长度
- 【08】看下面代码,给出输出结果[计时器]
- 【10】看下列代码,输出什么? [null相关]
- 【11】写一个正则,字母开头,后面可以是数字,下划线,字母,长度6-30
- 【12】以下代码的alert的值分别是多少?
- 【13】如何获取三个数中的最大值和最小值?
- 【14】数组去重几种方法是什么?
- 【15】求数组中的最大值
- 【16】求数组中的最小值
- 【17】获得每个月1号是星期几?
- 【18】将字符串转化为驼峰表示法
- 逻辑题目
- 【01】1元1瓶汽水,2个空瓶再换1瓶汽水,30元最多能喝几瓶?
- 【02】有8个球体,外观一样,但有1个球比其他7个球重,给你一个天平,几次能找出那个较重的球?
- CSS3
- 【01】把一个div变成圆左边蓝色 右边绿色
- 【02】css盒模型有哪些及区别
- 【03】什么是css盒模型
- 【04】如何让英文小写转换为大写
- 【05】 去掉inline-block元素间隙的几种方法
- 【06】less和sass的特点和区别
- 【07】什么叫优雅降级和渐进增强?
- 【08】rgba和opacity的透明何不同?
- 【09】css选择器有那些?CSS3新增了哪些
- 【10】CSS3有哪些新特性?
- 【11】display属性有哪些?
- 【12】box-sizing的属性和作用
- 【13】CSS样式覆盖规则
- HTML5
- 【01】请列举5个html5输入类型?并简要描述其用途?
- 【02】em和rem的区别?
- 【03】精灵图和base64 如何选择,或者字体图标什么时候使用?
- 【04】position定位有几种?有什么区别?哪几个是脱离文档流的?
- 【05】垂直水平居中的方法有几种?
- 【06】清除浮动的方法有哪些?
- 【07】link和import的区别
- 【08】opacity/visibility/display 隐藏对比
- 【09】XHTML和HTML有什么区别
- 【10】什么是语义化的HTML?
- 【11】常见的浏览器内核有哪些?
- 【12】HTML5有哪些新特性,移除了哪些元素?
- 【13】如何处理HTML5新标签的浏览器兼容问题?
- 【14】HTML5为什么只需要写!DOCTYPE HTML?
- 【15】介绍以下你对浏览器内核的理解?
- 【16】行内元素有哪些?块级元素有哪些?
- 【17】标签上title与alt属性的区别是什么?
- 【18】前端页面有哪三层构成是什么?作用是什么?
- 【19】H5特点有哪些?
- 【20】HTML5里的video标签支持哪些视频格式?
- 【21】margin-top父元素塌陷及解决办法
- 【22】透明度opacity的兼容写法
- 【23】让一行文字在固定宽度div里显示省略号的方法
- 【24】如何解决input和select的宽高不一致问题
- 【25】如何解决div与内部img间隙问题
- 【26】这个要改一下
- 【27】input设置为readonly和disable有什么区别?
- 【28】谈谈对BFC的理解
- 【29】简述src与href的区别
- 【30】什么是外边距重叠?以及防止方法
- 【31】HTML5 Input 表单新增输入类型
- 【32】HTML5语义化标签有哪些
- 【33】html常见兼容性问题
- 【34】Doctype的作用?严格模式与混杂模式的区别?
- 【35】HTML与XHTML的区别?
- 【36】input有那些类型?
- 【37】 img的alt与title有何异同?strong与em的异同?
- 【38】px和em的区别是什么?你还了解那些单位?
- 【39】把 Script 标签 放在页面的最底部的body封闭之前 和封闭之后有什么区别?浏览器会如何解析它们?
- 【40】什么是雪碧图?它作用是什么?
- Javascript
- 【01】简述ajax请求过程,以及注意事项。
- 【02】post和get的区别?
- 【03】简述jsonp跨域原理,以及你知道的其他跨域方法
- 【04】JSONP与JSON的区别
- 【05】谈谈对http和https的理解
- 【06】var let const 的区别是什么?
- 【07】简述“==”与“===”的区别?
- 【08】javascript各类型在转换为boolean式的规则?
- 【09】Object.creat()和new对象有什么区别?
- 【10】for in和Object.keys来遍历对象有什么区别?
- 【11】Object.assign()函数的作用及用法
- 【12】数组的常用方法有那些?
- 【13】js中内置 对象有哪些有哪些?
- 【14】控制台undefined和is not defined异常区别?
- 【15】JS中面向对象和面向过程的区别
- 【16】什么是脚本?
- 【17】cookies、sessionStorage和localStorage区别?
- 【18】谈一下你对面向对象的理解?
- 【19】什么是函数?
- 【20】正则验证,match()与test()函数的区别?
- 【21】什么是闭包?简述的优缺点
- 【22】Es6新特性有哪些?
- 【23】怎么判断一个object是否是数组(array)?
- 【24】函数声明和函数表达式的区别?
- 【25】this一般的指向,以及如何改变指向
- 【26】javascript的typeof返回哪些数据类型(和37重复了)
- 【27】列举IE和标准下有哪些兼容性的写法
- 【28】new操作符具体干了什么呢?
- 【29】什么是Json?
- 【30】js中的3种弹出式命令什么
- 【31】节点的种类有几种,分别是什么?
- 【32】Void(0)的作用是什么?
- 【33】箭头函数和普通函数的区别
- 【34】怎么获取对象的key值
- 【35】谈谈你对原型链的理解
- 【36】Javascript如何实现继承?
- 【37】typeof返回哪些数据类型
- 【38】创建函数的几种方式?
- 【39】js中同步和异步的区别
- 【40】事件绑定和普通事件有什么区别?
- 【41】documen.write和 innerHTML的区别?
- 【42】JS实现继承的6种方式
- 【43】什么是事件委派以及优缺点
- 【44】JS创建对象的几种方式?
- 【45】解释js垃圾回收机制和引起内存泄漏?
- 【46】DOM怎样添加、移除、移动、复制、创建和查找节点
- 【47】null和undefined的区别?
- 【48】正则常用符号代表什么?
- 【49】callee和caller的作用?
- 【50】如何阻止事件冒泡和默认事件?
- 【51】例举3种强制类型转换和2种隐式类型转换?
- 【52】JavaScript是一门什么样的语言,它有哪些特点?
- 【53】js延迟加载的方式有哪些?
- 【54】js作用域有那些
- 【55】同步和异步的区别?
- 【56】已知ID的Input输入框,希望获取这个输入框的输入值
- 【57】ajax请求的时候get 和post方式的区别
- 【58】eval()的作用
- 【59】如何用原生js给一个按钮绑定两个onclick事件?
- 【60】Javascript中的定时器有哪些?他们的区别及用法是什么?
- Node
- 【01】对nodejs的理解?
- 【02】import和require的区别
- 【03】Node.js的优点和缺点
- 框架及JS库
- 【01】jQuery如何实现事件委托?
- 【02】$(document).ready和window.onload的区别?
- 【03】v-if与v-show区别
- 【04】mvc和mvvm模式区别
- 【05】React早期创建组件的方式
- 【06】export与export default 的区别
- 【07】简述一下 Handlebars 的基本用法?
- React
- 【01】对React生命周期的理解
- 【02】React创建组件的三种方式及其区别是什么?
- 【03】react和vue有哪些不同,说说你对这两个框架的看法