js原型

作者: Super曲江龙Kimi | 来源:发表于2019-08-14 22:43 被阅读0次

对象

首先明确一点,对象都是通过函数创建的。let obj = {a:1} 只是一种快捷方式

原型 prototype

原型.png

每个函数都有一个prototype属性指向他的原型,这个prototype的属性值是一个对象,默认的只有一个叫做constructor的属性,指向这个函数本身。

function Foo () {}
let a = new Foo();
a.constructor // 指向Foo,但是constructor属性是从prototype上继承来的。
function Foo () {}
Foo.prototype = {} // 创建一个新原型对象
let a = new Foo();
a.constructor === Foo // false
a.constructor === Object // true  本身原型上没有了constructor 属性,则会沿着原型链查找到Object 

因为每个对象都有一个隐藏的属性“__proto__,这个属性引用了创建这个对象的函数的prototype。即:fn.__proto__ === Fn.prototype。所以可以使用原型的方法

原型.png

总结: 每个函数function都有一个prototype原型。每个对象都有一个__proto__隐式原型。

对象和函数关系

对象都是函数创建出来的,那么函数是谁创建的呢。---Function

原型链.png

再回顾下之前的总结

每个函数function都有一个prototype原型。每个对象都有一个__proto__隐式原型。

对于function Foo来说。他是函数。所以他就有一个prototype指向Foo.prototype,他也可以是对象(函数也是一种对象)。那么他也有一个__proto__指向创建他的函数的原型 Function.prototype

所以我们来看Object和Function的关系,就有种鸡生蛋、蛋生鸡的感觉


完整.png

function Function当做函数时有prototype指向Function.prototype。当对象时有一个__proto__指向创建他的函数的原型 ,那么谁创建的函数呢 答案肯定还是Function自己。感觉是自己创建了自己。而Function.prototype是一个对象。所以他有__proto__指向创建他的函数的原型。对象是function Object创建的
所以Function.prototype.__proto__ === Object.prototype

function Object当做函数时有prototype指向Object.prototype。当对象时有一个__proto__指向创建他的函数的原型,函数肯定是Function创建的。那么就有Object.__proto__ === Function.prototype。而Object.prototype对象的__proto__指向null。让原型链形成结束。

正是因为这样,Object、Function之间形成了一个闭环

Instanceof

Instanceof的判断是:沿着A的__proto__这条线来找,同时沿着B的prototype这条线来找,如果两条线能找到同一个引用,即同一个对象,那么就返回true。如果找到终点还未重合,则返回false。
所以以下判断都成立

Object instanceof Function // true
Function instanceof Object // true
// Function 当作对象__proto__指向创建它的Function的原型Function.prototype。
// 而Function.prototype是个对象,他的__proto__指向Object.prototype。判断为true
Function instanceof Function // true

instanceof表示的就是一种继承关系,或者原型链的结构
javascript中的继承是通过原型链来体现的。原型继承
访问一个对象的属性时,先在基本属性中查找,如果没有,再沿着__proto__这条链向上找,这就是原型链。

相关文章

  • 廖雪峰JS小记

    (function(){})() 原型,原型链 浅谈Js原型的理解JS 原型与原型链终极详解 对象 对象:一种无序...

  • Javascript(三)之原型继承理解

    进阶路线 3 原型继承 3.1 优秀文章 最详尽的 JS 原型与原型链终极详解 一 最详尽的 JS 原型与原型链终...

  • JS的__proto__和prototype

    最近在回顾JS的原型和原型链的知识,熟悉JS的同学都知道JS的继承是靠原型链实现的,那跟原型链相关的属性__pro...

  • 我的投稿

    js原型

  • JS原型

    最近一直在理解JS的原型------《你不知道的JS》--------《JS设计模式》 里面都讲JS的原型运作方式...

  • js基础(三)

    js基础 原型链和原型对象 ... ... js没有继承原型对象prototype通常用来添加公共的属性或行为且只...

  • 发现•分享—2019-01-17

    文章 JS JS 异步编程六种方案 JS基础—原型对象的那些事(一) JS基础—原型对象的那些事(二) CSS 综...

  • 前端资料

    ES6新数据类型 Symbol . js变量提升函数提升 js this js 原型及原型链理解 new做了什么 ...

  • javaScript中的面向对象思想之原型

    二、js的原型1、原型的概念原型是构造函数在js代码编译阶段,由系统为我们创建出来的一个对象;原型原型可以给系统构...

  • 前端开发必须知道的JS(一) 原型和继承(转载)

    前端开发必须知道的JS(一) 原型和继承 原型和闭包是Js语言的难点,此文主要讲原型及原型实现的继承,在(二)中会...

网友评论

      本文标题:js原型

      本文链接:https://www.haomeiwen.com/subject/qmlojctx.html