面试系列原地址 gitee.com/gusiil/fein…,持续更新中
原型链
属性
-
prototype
prototype 只有函数存在,实例对象是不存在 prototype 的
prototype 念做原型对象 -
__proto__
_proto_只是个指针,永远指向某个对象的 prototype
所有对象都存在proto, Object.prototype.__proto__指向 null,原型链的终点 -
constructor
每个实例对象都有 constructor,指向他的构造函数
constructor 读作构造函数
需要注意 constructor 只存在 prototype 上,实例上能访问本质是继承的 constructor
简单概念
-
当读取实例的属性时,如果找不到,就会查找与对象关联的原型中的属性,如果还查不到,就去找原型的原型,一直找到最顶层为止。
-
看代码
function Person() { } var person = new Person(); person.__proto__ == Person.prototype // true Person.prototype.constructor == Person // true // 顺便学习一个ES5的方法,可以获得对象的原型 Object.getPrototypeOf(person) === Person.prototype // true -
Person.prototype.constructor === Person === person.constructor
开始套娃
看代码
Function.prototype.__proto__ === Object.prototype // true
// 以下都是true
Function.__proto__ === Function.prototype
Object.__proto__ === Function.prototype
Number.__proto__ === Function.prototype
Date.__proto__ === Function.prototype
// 这两个是true
Math.__proto__ === Object.prototype
JSON.__proto__ === Object.prototype
如何理解这些内置属性的原型链呢?其实就是两个规律
- 本身是函数,可以 new 出对象的。本质都是 Function 的实例,Function 内置对象本身套娃,因此写死了
Function.constructor === Function - Math,JSON 本身是对象,没啥好说的