JS总结之原型
原型
今天我们谈谈原型,当我们使用对象时,该对象有一个__proto__的属性问的就是它的属性值来自哪里?
我们目前只举例三种 Function Object Array 带你了解过后可以自行推出其他
基于这三种公式
1. 对象.__proto__ === 其构造函数.prototype
例1: let a = {}
a的原型就是构造对象函数的prototype
a.__proto__ === Object.prototype
2. Object.prototype是所有对象的的直接或间接原型
例2:
Function.prototype.__proto__ === Object.prototype
3. 任何函数.__proto__ === Function.prototype
例3:任何函数包含构造函数和被构造出来的函数。
构造函数:
Object.__proto__ === Function.prototype
Function.__proto__ === Function.prototype
Array.__proto__ === Function.prototype
被构造出来的函数:
function fn(){}
fn.__proto__ === Function.prototype
根据以上的概念和公式,我们可以推出Object,Function,Array的原型以及被构造函数构造出来的对象的原型
1. Object
注意:Object.prototype是所有对象的直接或间接原型。那Object.prototype的原型是什么?是null(是没有的意思)
console.log(Object.prototype.__proto__ === null ) //true
//对象的构造函数
Object.__proto__ === Function.prototype //公式3
Object.__proto__.__proto__ === Object.prototype //公式3 再看公式2
Object.__proto__.__proto__.__proto__ === null //公式3 再看公式2 看看开头的注意
//对象实例
let a = {}
a.__proto__ === Object.prototype //公式1
a.__proto__.__proto__ === Object.prototype.__proto__ //先看公式1,再看开头的注意
2. Function
//函数的构造函数 Function
Function.__proto__ === Function.prototype //由于公式3 任何函数的原型是构造函数Function.prototype
Function.__proto__.__proto__ === Object.prototype //由于公式3.再看公式2
Function.__proto__.__proto__.__proto__ === Object.prototype.__proto__ //公式3 2 再看1. Object 开头的注意
Function.prototype.__proto__ === Object.prototype //由于公式2对象的prototype是所有对象间接的原型的典范
Function.prototype.__proto__.__proto__ === Object.prototype.__proto__ //由于公式2 再看1. Object 的开头注意
//函数实例 fn
function fn(){}
fn.__proto__ === Function.prototype //由于公式3任何函数的原型是Function.prototype
fn.__proto__.__proto__ === Function.prototype.__proto__ === Object.prototype //由于公式3再看公式2
fn.__proto__.__proto__.__proto__ === Function.prototype.__proto__.__proto__ === Object.prototype.__proto__
//由于公式3再看公式2 再看1. Object 开头的注意
fn.prototype.__proto__ === Function.prototype.__proto__ === Object.prototype //由于公式2
fn.prototype.__proto__.__proto__ === Function.prototype.__proto__.__proto__ === Object.prototype.__proto__
//由于公式2 再看1. Object 开头的注意
Array
//数组的构造函数
Array.__proto__ === Function.prototype //公式3
Array.__proto__.__proto__ === Function.prototype.__proto__
//再次公式1和3都满足在看公式2
Array.__proto__.__proto__.__proto__ === Object.prototype.__proto__
//再次公式1和3都满足在看公式2。再看1. Object开头的注意
//数组的实例
[].__proto__ === Array.prototype //公式1
[].__proto__.__proto__ === Object.prototype //公式1 再看公式2
[].__proto__.__proto__.__proto__ === Object.prototype.__proto__
//公式1 再看公式2 再看1.Object 开头的注意