JS function 是函数也是对象, 浅谈原型链

JS 唯一支持的继承方式是通过原型链继承, 理解好原型链非常重要, 我记录下我的理解

1. 前言

  1. new 出来的实例有 _proto_ 属性, 并且指向其构造函数的 prototype 对象

    function Person(){}
    const person = new Person();
    person.__proto__ === Person.prototype // true
  2. 所有 new 出来的实例有 _proto_ 属性, 所有函数有 prototype 属性

  3. 不要小看任何一个对象, 这个对象有可能是一个函数; 不要小看任何一个函数, 这个函数有可能也是一个对象

  4. 只要是对象, 一定就有相应的构造函数 ( 除了 Object 的原型对象找不到 )

2. 有趣的部分

  1. function 是函数, 但也是对象
  2. Object 是函数, 但也是对象
  3. 看一个对象是不是函数, 就看它有没有 prototype 属性, 像原型对象没有, 它就只是单纯的对象, 不是函数 ( 原型对象无原型 )
  4. Function 是函数, 也是对象, 并且它作为对象的 _proto_ 属性 等于 它作为函数的 prototype 属性, 这说明, 它 自己创建自己

3. 解释

  1. 以这个为例

    function Person(){}
    const person = new Person();
  2. function 是函数, 但也是对象

    • 是函数
    Person.prototype  // {constructor: ƒ ...}
    
    Person.prototype.constructor === Person // true

    这说明 Person 是函数, 有原型, 原型的 constructor 指向自己

    • 是对象
    Person.__proto__  // ƒ () { [native code] }
    
    Person.__proto__ === Function.prototype //true

    这说明 Person 是对象, 相当于 Person = new Function() , 有没有那味了呢

  3. 原型对象是单纯的对象, 不是函数

    Person.prototype.prototype  // undefined 不是函数, 无原型
    
    Person.prototype.__proto__  // {constructor: ƒ...} 
    
    Person.prototype.__proto__ === Object.prototype  // true

    原型对象无原型, 说明原型对象就只是一个对象, 是对象肯定就有构造函数, 其构造函数是 Object, 相当于 Person.prototype = new Object()

  4. Object 是函数, 但也是对象

    Object.prototype  // {constructor: ƒ ...} 是函数, 有原型
    
    Object.prototype.__proto__  // null 所有对象都有其构造函数,  Object 原型对象例外
    
    Object.__proto__  // ƒ () { [native code] } Object 是对象
    
    Object.__proto__ === Function.prototype  // true

    Object 有原型对象, 说明它是个函数, 并且它的原型是唯一一个找不到构造函数的; Object 是对象, 有自己的构造函数, 并且它的构造函数是 Function. 相当于 Object = new Function()

  5. Function 是函数, 也是对象, 并且它自己创建自己

    Function.prototype  // ƒ () { [native code] } 是函数
    
    Function.__proto__  // ƒ () { [native code] } 是对象
    
    Function.__proto__ === Function.prototype  // true
    
    Function.prototype.__proto__ === Object.prototype  // true

    经过前面的讨论, 从这个代码可以看出, Function 即是函数也是对象, 并且相当于自己创建了自己, 相当于 Function = new Function(); ; Function 的原型对象的构造函数也是 Object, 相当于 Function.prototype = new Object()

4. 关系图

new 的看法, new 出来的对象一定有 _proto_ 指向其构造函数的 prototype.

Function = new Function();
Object = new Function();
Person = new Function();
所有的原型对象 = new Object(); // 非继承, 人为修改后会发生变化
person = new Person();

JS function 是函数也是对象, 浅谈原型链的更多相关文章

  1. js function定义函数的4种方法

    js function定义函数的4种方法 1.最基本的作为一个本本分分的函数声明使用. 复制代码代码如下: 复制代码代码如下: function func(){} 或 var func=functio ...

  2. JS对象继承与原型链

    1.以复制方式实现的继承 1.1浅拷贝 基本类型的复制 var parent = { lanage: "chinese" } var child = { name: "x ...

  3. jsp内置对象浅谈

    jsp内置对象浅谈 | 浏览:1184 | 更新:2013-12-11 16:01 JSP内置对象:我们在使用JSP进行页面编程时可以直接使用而不需自己创建的一些Web容器已为用户创建好的JSP内置对 ...

  4. JS核心系列:浅谈原型对象和原型链

    在Javascript中,万物皆对象,但对象也有区别,大致可以分为两类,即:普通对象(Object)和函数对象(Function). 一般而言,通过new Function产生的对象是函数对象,其他对 ...

  5. js中的函数,Date对象,Math对象和数组对象

    函数就是完成某个功能的一组语句,js中的函数由关键字 function + 函数名 + 一组参数定义;函数在定义后可以被重复调用,通常将常用的功能写成一个函数,利用函数可以使代码的组织结构更多清晰. ...

  6. [js高手之路]原型对象(prototype)与原型链相关属性与方法详解

    一,instanceof: instanceof检测左侧的__proto__原型链上,是否存在右侧的prototype原型. 我在之前的两篇文章 [js高手之路]构造函数的基本特性与优缺点 [js高手 ...

  7. js 中对象--对象结构(原型链基础解析)

    对于本篇对于如何自定义对象.和对象相关的属性操作不了解的话,可以查我对这两篇博客.了解这两篇可以更容易理解本篇文章 用构造函数创建了一个对象  obj对象的本身创建了两个属性  x=1   ,y=2 ...

  8. JS学习笔记——JavaScript继承的6种方法(原型链、借用构造函数、组合、原型式、寄生式、寄生组合式)

    JavaScript继承的6种方法 1,原型链继承 2,借用构造函数继承 3,组合继承(原型+借用构造) 4,原型式继承 5,寄生式继承 6,寄生组合式继承 1.原型链继承. <script t ...

  9. 关于js的几道经典题(作用域、原型链等)自己做的

    1. function test() { var a = 1; setTimeout(function() { alert(a); a = 3; }, 1000); a = 2; setTimeout ...

随机推荐

  1. 查询Oracle日志文件的方法

    Oracle日志文件相信经常使用Oracle数据库的朋友都比较熟悉了,下面将为您介绍的是查询Oracle日志文件的几种方法,供您参考学习. 1.查询系统使用的是哪一组日志文件: select * fr ...

  2. PyQt(Python+Qt)学习随笔:QTabWidget选项卡部件外观展示类属性elideMode、documentMode、tabBarAutoHide、tabShape介绍

    QTabWidget的外观展示类属性包括tabPosition.tabShape.elideMode.usesScrollButtons.documentMode.tabBarAutoHide和ico ...

  3. PyQt学习随笔:QTableWidget的selectedRanges、setRangeSelected访问选中矩形范围的方法

    老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 在QTableWidget对项的操作支持选中多个项的情况下,可以通过方法selectedRanges ...

  4. PyQt(Python+Qt)学习随笔:Designer中的QDialogButtonBox的orientation和centerButtons属性

    orientation属性 orientation属性表示QDialogButtonBox的方向,缺省情况下,方向为水平方向(值为Qt.Horizontal),表示QDialogButtonBox中的 ...

  5. 记账本APP小升级

    增加了显示当月总收入和总支出的功能,增加了选择收支类型的功能,删去了删除账目后恢复的功能. 1.数据库的升级 1.entity 添加了一个收支类型的字段: package com.example.ca ...

  6. Python运算符可不只有加减乘除

    数学里面的加减乘除,就是运算符,但是 Python 的运算符更多样,更复杂,分为算术运算符.比较运算符.赋值运算符.位运算符.逻辑运算符.成员运算符.身份运算符.为了更直观的看到运算符的使用,本文采用 ...

  7. 一份平民化的MySQL性能优化指南

    前言 近期在重新学习总结MySQL数据库性能优化的相关知识,本文是根据自己学习以及日常性能测试调优过程中总结的经验整理了一份平民化的优化指南,希望对大家在进行MySQL调优分析时有帮助!   MySQ ...

  8. Element-ui 实现table的合计功能

    Element-UI是饿了么前端团队推出的一款基于Vue.js 2.0 的桌面端UI框架,其功能较为完善,根据其文档与demo学习,非常容易上手,但是我在使用其tabel组件时,发现我的功能 需求并不 ...

  9. JAVA中关于set()和get()方法的理解以及使用

    set()和get()方法的理解 set和get这两个词的表面意思,set是设置的意思,而get是获取的意思,顾名思义,这两个方法是对数据进行设置和获取用的. 而且,在类中使用set和get方法时,都 ...

  10. 02-flask-路由基础

    代码 from flask import Flask # 创建Flask对象 app = Flask(__name__) # 定义路由 @app.route('/') def index(): # 函 ...