问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

javascript原型,原型链02?02有什么特点

发布网友 发布时间:2022-04-28 12:25

我来回答

1个回答

热心网友 时间:2022-05-14 14:35

原型链一直是个很抽象的概念,看不到,摸不着.随着最近对JavaScript进一步的学习,我对原型链有了一点理解,下面讲出来.
基础知识
在JavaScript中,一共有两种类型的值,原始值和对象值.每个对象都有一个内部属性[[prototype]],我们通常称之为原型.原型的值可以是一个对象,也可以是null.如果它的值是一个对象,则这个对象也一定有自己的原型.这样就形成了一条线性的链,我们称之为原型链.
访问一个对象的原型可以使用ES5中的Object.getPrototypeOf方法,或者ES6中的__proto__属性.
原型链的作用是用来实现继承,比如我们新建一个数组,数组的方法就是从数组的原型上继承而来的.
var arr = [];
arr.map === Array.prototype.map //arr.map是从arr.__proto__上继承下来的,arr.__proto__也就是Array.prototype
图形化原型链
虽然我们都说原型链,但实际上,在不考虑网页中frame的情况,js引擎在执行期间的某一时刻,所有存在的对象组成的是一棵原型树.默认情况下,只有一棵树.根节点可以说是Object.prototype,也可以说是null.
但我们可以再建立一棵原型树,通过使用Object.create方法
var foo = Object.create(null); //foo是一个对象,但它是游离的,不属于已有的那棵原型树
var bar = Object.create(foo); //bar的原型是foo
var baz = Object.create(foo); //baz的原型是foo
这样我们有了第二棵原型树
遍历原型链
我们没有办法遍历到所有以某个对象为原型的对象,但我们可以向上遍历,获取到一个对象所有的上层原型,这个原型链必定是线性的,尽头是null.
function getPrototypeChain(object) {
var protoChain = [];
while (object = object.__proto__) {
protoChain.push(object);
}
protoChain.push(null);
return protoChain;
}
试验一下,不同的环境实现不同,显示形式也不同.下面是在chrome控制台中的显示.
>getPrototypeChain(new String(""))
[String, Object, null] //依次是String.prototype,Object.prototype,null

>getPrototypeChain(function(){})
[function Empty() {}, Object, null] //依次是Function.prototype,Object.prototype,null
内置类型的对象的原型链并不长,下面试试宿主对象.
>getPrototypeChain(document.createElement("div"))
[HTMLDivElement, HTMLElement, Element, Node, Object, null]
这个就长多了.
超长原型链
可以看出来,我们平时使用的对象并没有很长的原型链.但可以自己构造一个.
function Foo() {}
for (var i = 0; i < 100; i++) {
Foo.prototype["foo" + i] = i;
Foo.prototype = new Foo;
}
console.dir(getPrototypeChain(new Foo));
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
给好闺蜜的祝福语 怎样提高手机app的打开速度 ...使用过程中哪些情况必须送检,和最好送检。送检物如何取? 为什么从别的电脑上拷贝的OFFICE文件在自己的电脑上打不开? 蚊香忘记灭了会着火吗-蚊香没灭会把东西烧着吗 怎么每天孩子(27)一起床,家长就开始催刷牙,孩子没有刷的话就各种说教... 为什么有人午休起床要刷牙? 我想买一副塔罗牌,我只是想学一下,入门即可。包头哪里有卖的 我想学习塔罗牌,不知道要怎么入门,谁能推荐一下买什么书,买什么牌子... 泉州哪里可以 学塔罗牌 JavaScript中构造函数的原型与实例(方法和属性区别,求解,小弟先谢谢了... javascript Function的原型对象为什么是空函数 javascript中Function.prototype的问题 关于javascript中的__proto__问题 请问大家javascript里 Function.prototype 有显示的prototype属性吗? js里,一个function的属性和它的prototype的属性有什么区别 ipadpro16g内存比8g强多少 如何用 css 画出一个椭圆 2011年主管护师的成绩单找不到了,怎么能补呢? 需要补考护师成绩单忘记打印怎么办 2016考主管护师过两科,忘记打印成绩单,如何补办?会不会影响拿证? 护师成绩单打印时间过了怎么办 考了两年过了主管护师,14年成绩单丢了怎么办 2017年考主管护师过了三科 但是忘了打印成绩单 2018年过了剩下的一科 能领主管证吗 去年考护师 最后一门没过 今年补考过了 去年的成绩没打印成绩单 怎么 第二年补考护师需要第一年的成绩单吗,如果丢了怎么办? 护师成绩过了忘记打印成绩单怎么办 主管护师成绩单没打印怎么补办 2018年护师成绩单打失了,可以补打吗?补打需要些什么材料? 主管护师上一年通过两科的成绩单未打印怎么补办? javascript中用prototype向原型中添加新属性和方法时这条语句可以写在... 安卓手机怎么才能看动态gif图片? 一个日剧叫什么食堂的 有一部日剧叫什么食堂 如何评价日剧《深夜食堂5》? 推荐类似《深夜食堂》的料理日剧 求猪猪字幕版日剧《深夜食堂》第3季(高清字幕版) 《深夜食堂》口碑扑街,日剧改编究竟都有哪些问题 如何评价日剧《深夜食堂 3》?还有什么类似的日剧? 《深夜食堂》是一部怎样的日剧 日版电影《深夜食堂2》除了是一部治愈电影还是什么? nike,公司货,超a,高品质等跟正品有什么区别??? css3半椭圆怎么画 想找一部日剧,是关于西餐餐厅主厨的,男主角是个有点逗比的大叔 求日剧《不伦食堂》百度云资源 深夜食堂日版的电影和日版的电视剧是一样的剧情吗 鞋子牌子有公司级有真爆有真标还有高仿是什么意思?都是仿的吗? 有什么美食日剧 高仿鞋和正品鞋如何区分? 高端的衣服和高品质的衣服的区别