什么是原型链
从一个实例对象往上找构造这个对象的相关联的对象,然后这个关联的对象再往上找,又能找到创造它的原型对象,以此类推,一直到Object.prototype
原型对象终止,这个链条就终止了。
Object.prototype是原型链的顶端。
是通过prototype和proto这两个属性来完成原型链查找的。
原型链的属性
- 1、每一个函数数据类型(普通函数、类)都有一个天生自带的属性:prototype(原型),并且这个属性是一个对象数据类型的值
- 2、并且在
prototype
上浏览器天生给他加了一个属性constructor(构造函数),属性值是当前函数(类)本身 - 每一个对象数据类型(普通对象、实例、prototype ...)也天生自带一个属性:proto,属性值是当前实例所属类的原型
function Fn() {
this.x = 100;
}
Fn.prototype.getX = function () {
console.log(this.x);
}
console.log(Fn.prototype.constructor); // Fn
let f1 = new Fn;
f1.getX(); // 100
let f2 = new Fn;
f2.getX(); // 100
proto:获取指定对象的构造函数的原型对象
const obj = {}
const fn = function () { ... }
function Foo () { ... }
const foo = new Foo()
// 所有函数对象的构造函数的原型对象都指向"Function.prototype"
Object.__proto__ === Function.prototype
Function.__proto__ === Function.prototype
Foo.__proto__ === Function.prototype
// 原型对象,原型对象的构造函数的原型对象都是"Object.prototype"
Foo.prototype.__proto__ === Object.prototype => true
Function.prototype.__proto__ === Object.prototype => true
// 实例对象,重点在于找到实例对象的构造函数是谁,参考下面的"constructor"部分
obj.__proto__ === Object.prototype => true
fn.__proto__ === Function.prototype => true
foo.__proto__ === Foo.prototype => true
constructor:获取指定对象的构造函数
// 所有函数的”constructor”属性都指向”Function“
Object.constructor === Function => true
Function.constructor === Function => true
Foo.constructor === Function => true
// 原型对象
Object.prototype.constructor === Object => true
Function.prototype.constructor === Function => true
Foo.prototype.constructor === Foo => true
// 实例对象
obj.constructor === Object => true
fn.constructor === Function => true
foo.constructor === Foo => true
prototype,函数特有的属性,获取指定函数的原型对象,比如:
Object函数的原型对象 => Object.prototype
Function函数的原型对象 => Function.prototype
Foo函数的原型对象 => Foo.prototype
网友评论