JS的原型和闭包(4-6)

2019-08-06  本文已影响0人  zzyo96
原文地址: 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
由于所有的对象的原型链都会找到Object.prototype,因此所有的对象都会有Object.prototype的方法。这就是所谓的“继承”。
上一篇 下一篇

猜你喜欢

热点阅读