__proto__
和constructor
是对象特有的,prototype
是函数特有的
构造函数:可以通过new来新建一个对象的函数
实例:通过构造函数和new创建出来的对象,便是实例。
实例通过__proto__
指向原型,通过constructor
指向构造函数
原型
函数都有prototype属性,称之为原型,可以放一些属性和方法,共享给实例对象使用。
js获取原型的方法:
-
p.__proto__
-
p.constructor.prototype
-
Object.getPrototypeOf(p)
原型链
当我们访问一个对象的属性时,如果这个对象内部不存在这个属性,那么它就会去它的原型对象里找这个属性,这个原型对象又会有自己的原型,于是就这样一直找下去,也就是原型链的概念,原型链由原型对象组成,每个对象都有__proto__
属性,指向了创建该对象的构造函数的原型,原型链的尽头是null
。是一个用来实现继承和共享属性的有限的对象链。
obejct.constructor.prototype
== object.__proto__
原型链判断
Object.prototype.__proto__;
Function.prototype.__proto__;
Object.__proto__;
Object instanceof Function;
Function instanceof Object;
Function.prototype === Function.__proto__;
答案
Object.prototype.__proto__; // null
Function.prototype.__proto__; // Object.prototype
Object.__proto__; // Function.prototype
Object instanceof Function; // true
Function instanceof Object; // true
Function.prototype === Function.__proto__; // true
实例、原型、构造函数,三者之间的关系:
实例.__proto__ === 原型
原型.constructor === 构造函数
构造函数.prototype === 原型