原型链详解
来源:互联网 发布:半自动咖啡机推荐 知乎 编辑:程序博客网 时间:2024/06/07 08:48
校招季,走前端方向的同学们肯定都被问过原型链相关的问题吧,这是js的基础问题了,只不过让大家总结,可能又说不太出来,结合自己看过的文章以及自己的理解,我大概整理了一下,希望能帮助到那些还在泥潭中挣扎的同学~
本文借鉴的文章链接。
结论1:在js中如果A对象是由B函数构造的,那么A._proto_ === B.prototype。
function Person() { } var obj = new Person(); alert(obj.__proto__ === Person.prototype);//true
这是单个对象及其原型,当我们将多个对象的原型建立联系时,就会产生原型链,
也可以暂时这样理解:由对象的__proto__属性和对象的构造函数的原型的__proto__属性构成的链式结构叫原型链
举例:
function Foo(){...}Foo.prototype.name = function(){...}function Bar(){...}Bar.prototype = Object.create(Foo.prototype);//用Bar.prototype = new Foo()来做也可以,不过没这种方法好,可以防止Foo内部有某些其他不想要的操作,对bar造成副作用。es6的setPrototypeOf方法也可以。var bar = new Bar();//bar.__proto__.__proto__ === Foo.prototype
这样一个简单的原型链就生成了~
结论2:Object.prototype只是一个普通对象,它是js原型链的最顶端。
(typeof Object.prototype) === object;//true Object.prototype.__proto__=== null;//true Object.prototype.prototype === undefied;//true
Object.prototype只是一个普通对象(普通对象没有prototype属性,所以值是undefined),Object.prototype是js原型链的最顶端,它的__proto__是null(有__proto__属性,但值是null,因为这是原型链的最顶端)。
结论3:javascript中对象是由Object创建的,函数是由Function创建的。
function Person() { } var obj = {}; alert(obj.__proto__ === Object.prototype);//true alert(Person.__proto__ === Function.prototype);//true
结论4:函数也是对象,js中每一个对象都有_proto_属性,但是只有函数才有prototype属性。
//函数 function Person() { } // 普通对象 var obj = {}; obj.__proto__ === Object.prototype;//true obj.prototype === undefined;//true Person.__proto__ === Function.prototype;//true Person.prototype !== undefined;//true
我们知道javascript正是通过prototype实现继承的。如果objA、objB都是由cFunction创建的,那么根据结论2,objA.__proto__ === objB.__proto__ === cFunction.prototype,也就是说objA和objB对象都继承了cFunction的prototype。
内置的Object是其实也是一个函数,它是由Function创建的
Object.prototype是原型链终点
Object.__proto__ === Function.prototype;//true
内置的Function也是一个函数,它是通过自己来创建自己的
Function这个函数,由其自身通过Function函数构造的。
(typeof Function.__proto__) === function;//true Function.__proto__=== Function.prototype;//true
所以
Function.__proto__=== Function.prototype===Object.__proto__
结论5:Function.prototype是个特例,它是函数,但是没有prototype属性。其他所有函数都有prototype属性
(typeof Function.prototype) === function;//trueFunction.prototype.prototype === undefined;//true
(typeof Function.prototype.__proto__) === "object";//true Function.prototype.__proto__=== Object.prototype;//true
最后提一下:原型链是基于__proto__形成的,继承是通过prototype实现的。
每个对象都有一个__proto__属性,原型链上的对象正是依靠这个__proto__属性连结在一起的! 对于原型链上的一个对象obj,那么访问obj.xxx属性(方法也是属性)的过程是: 如果自身有xxx属性,则访问它;如果没有,就通过__proto__属性找到其原型链的上一级原型对象,看它有没有xxx属性,如此递归查找,直至找到xxx属性或到了原型链顶端Object.prototype对象为止。
函数拥有prototype属性,该属性值是一个object类型。当函数A创建对象B的时候,B对象的__proto__会指向A.prototype,这就是javascript的继承。
知识点补充:
1.其实__proto__属性并不存在于你正在使用的对象中,实际上,它和toString等方法一样,存在于内置的Object.prototype中,它“ 神奇的 ”引用了对象内部的[[Prototype]],而且双下划线更像是私有属性,也不符合es6规范,我们应该尽量避免用这种写法,可以用Object.getPrototypeOf()和Object.setPrototypeOf()代替。
2.如何找出一个对象的祖先呢?
第一种方法,可以用 instanceof
bar instanceof Foo//true//在bar的整条原型链中有没有Foo.prototype
可惜这个方法只能处理对象(bar)和函数之间的关系,如果想判断对象和对象之间的关系,可以用 isPrototypeOf
Foo.prototype.isPrototypeOf(bar)//在bar的整条原型链中有没有Foo.prototype(可用别的对象替换)
- 原型和原型链详解
- JavaScript 原型链详解
- 详解原型链继承
- Javascript原型链详解
- 详解原型链继承
- javascript原型链详解
- javascript原型链详解
- JavaScript原型链详解
- 原型链详解
- JS原型与原型链终极详解
- JS原型与原型链终极详解
- JS原型与原型链终极详解
- JS原型与原型链终极详解
- JS原型与原型链终极详解
- JavaScript prototype原型和原型链详解
- JS原型与原型链终极详解
- JavaScript-- prototype原型和原型链详解
- JavaScript原型及原型链详解
- shell-export
- [Ubuntu]虚拟机VirtualBox安装win7完整步骤
- 未优化的冒泡排序算法.c
- CS 400 8 Divisible 同余+模拟
- java字符串预习
- 原型链详解
- Fragment
- centos7.4编译reids4.0.2出现MALLOC=jemalloc错误
- linux进程地址空间
- 展讯平台android display驱动分析
- java注解
- 使用BottomTabBar实现底部导航,MVP网络框架,retrofit解析
- 洛谷 [P1403] 约数研究
- 在debian9上安装citrix receiver登录citrix虚拟桌面