原文地址: https://www.cnblogs.com/wangfupeng1988/p/3979290.html
1.每个函数function都有一个prototype,即原型(也叫显示原型)。每个对象都有一个proto,可称为隐式原型。
2.每个对象都有一个proto属性,指向创建该对象的函数的prototype。
object.__proto__ === Object.prototype // 为 true
object.__proto__.__ proto __=== null (特例)
var fn = function(){}
fn.__proto__ === Function.prototype // 为 true
fn.__proto__.__proto__ === Object.prototype // 为 true
var array = []
array.__proto__ === Array.prototype // 为 true
array.__proto__.__proto__ === Object.prototype // 为 true
true.__proto__ === Boolean.prototype // 为 true
var a = ‘我’
a.__proto__ === String.prototype
var b = 1
b.__proto__ === Number.prototype
-------------------------------------------------------
Function.__proto__ === Function.prototype // 为 true
Array.__proto__ === Function.prototype // 为 true
Object.__proto__ === Function.prototype // 为 true
String.__proto__ === Function.prototype
Number.__proto__ === Function.prototype
Function.prototype.__proto__ === Object.prototype // 为 true
String.prototype.__proto__ === Object.prototype
Number.prototype.__proto__=== Object.prototype
Array.prototype.__proto__=== Object.prototype
Boolean.prototype.__proto__=== Object.prototype
String.prototype.__proto__ === Object.prototype
Object.prototype.__proto__ === null
image.png
--------------------------------------------
三、js中的继承是通过原型链来体现的
image.png
以上代码中,f1是Foo函数new出来的对象,f1.a是f1对象的基本属性,f1.b是怎么来的呢?——从Foo.prototype得来,因为f1.proto指向的是Foo.prototype
访问一个对象的属性时,先在基本属性中查找,如果没有,再沿着proto这条链向上找,这就是原型链。
区分一个属性是自由属性还是从原型链中即成的,用hasOwnProperty
image.png
那么其中hasOwnProperty既不是在f1的本身 也不是在Foo.prototype中,而是在Object.prototype中
Foo.prototype__proto__ === Object.prototype
image.png