javascript有5种基础的内建对象(Fundamental Objects)ObjectFunctionErrorSymbolBoolean,而Object/Function尤为特殊,是定义其他内建对象或者普通对象和方法的基础。

详细的了解ObjectFunction对象有助于更好的理解javascript的一些工作原理。

和其他引用类型一样,Object/Function既是对象,有自己的方法和属性,也是函数,可以作为构造函数。
本文主要讨论以下几个问题:

  • Fucntion.prototype和普通对象的prototype有何区别?
  • Object.prototype.__proto__ = ?
  • Object.__proto__ = ?
  • ObjectFunction的原型对象有何特殊之处?

Function

Function的属性

在ES6标准中,Function 对象有两个属性:

  • length
    值为1,这个属性的特性为{ [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true },即不可覆盖,不可被for...in遍历,但可以通过Object.defineProperty修改它的上面这些特性

  • prototype
    为原型对象,(见ES最新标准说明 Function.prototpye)它跟一般函数的prototype的区别在于

    • ❗️它不可写,不可配置,不可遍历。 即它永远指向固定的一个对象,且是其他所有函数的原型对象,所有函数本身的__proto__指向它。
    const o = {number: 20}
    Function.prototype = o // 依然是原来的值,未改变 typeof Array.__proto__ // 'function' [=== Function.prototype]
    typeof Object.__proto__ // 'function' [=== Function.prototype] typeof Array.prototype.__proto__ // 'object' [=== Object.prototype] function F () {}
    F.__proto__ === Function.prototype // true F.prototype = o // prototype指向o
    • ❗️它是一个函数。 一般函数的prototype是一个带有constructor属性的普通对象,但Functionprototype是一个函数对象(built-in function object),js中唯一一个默认prototype为函数的对象
    typeof Function.prototype // 'function'
    
    function F () {}
    typeof F.prototype // ☘ 'object'
    typeof Object.prototype // 'object'

这是ES标准中规定的Function对象的两个属性,但其实在FireFox、Chrome在实现时,还有一个name属性,它的值就是'Function'。另外还有一个属性,就是__proto__

相比于ObjectFunction对象自带属性是比较少的

★ Function.prototype

在ES规范,有关Function.prototype部分 定义的Functionprototype的方法有

Function.prototype.apply
Function.prototype.bind
Function.prototype.call
Function.prototype.contructor
Function.prototype.toString
Function.prototype[@@hasInstance](V)

函数和对象都有__proto__属性,指向构造函数的prototype属性所指向的对象,即它的原型对象。

而函数的__proto__属性(❗️并非它的原型对象prototype上的__proto__属性)指向Function.prototype,所以Function.prototype上的属性和方法都会被函数对象(function object)所继承。

通过上面的介绍,相信能够明白以下这些有意思的等式为何成立

Function.__proto__ === Function.prototype // true ❗️
Object.__proto__ === Function.prototype // true
Object.prototype.__proto__ === null // true
Function.prototype.__proto__ === Object.prototype // true
Object.prototype === Object.__proto__ // false

同时,因为函数对象本身有prototype属性,是Object的实例,所以也继承了Object.prototype的属性

Object

★ Object函数对象的属性

Object作为函数,与普通函数一样,有lengthprototype__proto__name属性,除此之外,还有很多没有被继承的私有方法

// 方法
Object.assign()
Object.create()
Object.defineProperties()
Object.defineProperty()
Object.entries()
Object.freeze()
Object.getOwnPropertyDescriptor()
Object.getOwnPropertyDescriptors()
Object.getOwnPropertyNames()
Object.getOwnPropertySymbols()
Object.getPrototypeOf()
Object.is()
Object.isExtensible()
Object.isFrozen()
Object.isSealed()
Object.keys()
Object.preventExtensions()
Object.seal
Object.setPrototypeOf()
Object.values()

Object函数对象的方法不是这里的重点,就不再展开。

★ Object.prototype

Function.prototype和其他引用类型(Array.prototypeString.prototype)一样是不可写不可配置不可for...in遍历的,但依然可以被扩展,即可以往Object.prototype新增属性和方法

Object.isExtensible(Object.prototype) // true
  • ❗️Object.prototype的一个重要特性是,它是所有对象原型链的终点,因为Object.prototype.__proto__的值为null,即
Object.prototype.__proto__ === null

一个对象的实例,沿着它的原型链,通过__proto__一层层往上找某一个属性,如果在Object.prototype上没找到,那就会返回undefined,所以,原型链不会无限的找下去。

function F () {}
F.prototype.age = 20
let f = new F()
f.__proto__ === F.prototype // true
f.__proto__.__proto__ === Object.prototype //true
f.__proto__.proto__.__proto__ === null // true /**
* 查找过程
* f.color -> 没找到,继续
* f.__proto__.color(F.prototype) -> 没找到,继续
* f.__proto__.__proto__.color(F.prototype.__proto__,Object.prototype) 没找到,返回undefined
* 如果继续 f.__proto__.__proto__.__proto__ (Object.prototype.__proto__) === null 结果跟上面一样
*/
console.log(f.color) // undefined

Object.prototype上的属性和方法,会被js中的所有方法和对象所继承,ES规范中的属性

Object.prototype.constructor
Object.prototype.hasOwnProperty()
Object.prototype.isPrototypeOf()
Object.prototype.propertyIsEnumerable()
Object.prototype.toLocaleString()
Object.prototype.toString()
Object.prototype.valueOf()
Object.prototype.__proto__

下图是FunctionObjectFunction.prototypeObject.prototye相互之间关系图


Object、Function的关系

ObjectFunction之间最让人琢磨不透的,就是他们的关系

Object instanceof Object // true
Object instanceof Function // true
Function instanceof Function // true
Function instanceof Object // true const o = {}
o instanceof Object //true
o instanceof Function // false function F () {}
F instanceof Object //true
F instanceof Function //true

未完待续 ~~~

Function和Object 应该知道的的更多相关文章

  1. 那些必须要知道的Javascript

    原文:那些必须要知道的Javascript JavaScript是前端必备,而这其中的精髓也太多太多,最近在温习的时候发现有些东西比较容易忽略,这里记录一下,一方面是希望自己在平时应用的时候能够得心应 ...

  2. 每一个JavaScript开发者都应该知道的10道面试题

    JavaScript十分特别.而且差点儿在每一个大型应用中起着至关关键的数据.那么,究竟是什么使JavaScript显得与众不同,意义非凡? 这里有一些问题将帮助你了解其真正的奥妙所在:   1.你能 ...

  3. 关于C#你应该知道的2000件事

    原文 关于C#你应该知道的2000件事 下面列出了迄今为止你应该了解的关于C#博客的2000件事的所有帖子. 帖子总数= 1,219 大会 #11 -检查IL使用程序Ildasm.exe d #179 ...

  4. 关于WPF你应该知道的2000件事

    原文 关于WPF你应该知道的2000件事 以下列出了迄今为止为WPF博客所知的2,000件事所创建的所有帖子. 帖子总数= 1,201 动画 #7 - 基于属性的动画 #686 - 使用动画制作图像脉 ...

  5. Python小白需要知道的 20 个骚操作!

    Python小白需要知道的 20 个骚操作! Python 是一个解释型语言,可读性与易用性让它越来越热门.正如 Python 之禅中所述: 优美胜于丑陋,明了胜于晦涩. 在你的日常编码中,以下技巧可 ...

  6. 每个JavaScript开发人员应该知道的33个概念

    每个JavaScript开发人员应该知道的33个概念 介绍 创建此存储库的目的是帮助开发人员在JavaScript中掌握他们的概念.这不是一项要求,而是未来研究的指南.它基于Stephen Curti ...

  7. 你应该知道的RPC原理

    你应该知道的RPC原理 在学校期间大家都写过不少程序,比如写个hello world服务类,然后本地调用下,如下所示.这些程序的特点是服务消费方和服务提供方是本地调用关系. 而一旦踏入公司尤其是大型互 ...

  8. 百度知道的php爬虫

    原文地址:百度知道的php爬虫作者:好宏杰软件 <?php class spider  {    private $content ;    private $contentlen ;    p ...

  9. 嵌入式程序员应知道的0x10个基本问题

     来源:网络 嵌入式程序员应知道的0x10个基本问题 1 . 用预处理指令#define 声明一个常数,用以表明1年中有多少秒(忽略闰年问题)#define SECONDS_PER_YEAR (60 ...

随机推荐

  1. linux mint 安装微信2

    很多小伙伴都用ubuntu或者Linux Mint,但由于已经习惯了让人成瘾的国产软件,比如迅雷,qq,微信等,其实我们应该培养更为健康的上网习惯,这些软件不是非用不可,但如果你不用不行, 那么也是有 ...

  2. nfs服务器的搭建和使用

    目录 更新记录 1.nfs介绍 1.1 nfs概念 1.2 nfs工作原理 1.3 nfs通讯过程 2.搭建和测试 NFS 服务器 2.1 搭建NFS服务器 2.2 测试NFS服务器 3.在线调试:N ...

  3. 01 Go之环境搭建

    1.1 Linux搭建Go环境 1.ssh远程登录Linux服务器,可选用iTerm.xshell ssh root@ip 2.建议配置好阿里云yum源.epel源 安装git yum install ...

  4. Excel中把图片合并进图表的方法介绍

    方法一: 使用“图案”对话框 双击某个数据系列,选择“图案”标签,单击“填充效果”按钮,在“填充效果”对话框中选择“图片”标签,单击“选择图片”按钮,选择一个要使用的图形文件即可. 方法二: 使用剪贴 ...

  5. vue防重复点击(指令实现)

    快速点击按钮会重复多次调用接口,防止出现这样的情况 全局定义,方便调用 新建plugins.js export default { install (Vue) { // 防重复点击(指令实现) Vue ...

  6. Hyperledger Fabric(5)ChainCode的编写步骤

    链码(chaincode) 会对 Fabric应用程序  发送的交易做出响应,执行代码逻辑,与 账本 进行交互. 再复习下他们之间的逻辑关系: Hyperledger Fabric 中,Chainco ...

  7. java_day02_标识符等

    ch02 目标: 1. 标识符.关键字和类型介绍 2. 如何构建类---------------------------------1.注释 作用:使部分内容只为程序员可见,不为编译器所编译.虚拟机所 ...

  8. bootstrap和JS实现下拉菜单

    // bootstrap下拉菜单 <div class="btn-group"> <button id="button_text" type= ...

  9. XML刚学会,怎么又出来个YAML!

    XML(eXtensible Markup Language)可扩展标记语言,曾经是IT软件开发界,标记数据.定义数据的大哥大. 很多从事Spring的同学,没少花时间在写XML文件上吧? 不过随着时 ...

  10. springboot的一些开源项目

    原文标题:精选SpringBoot八大开源项目:支付.秒杀.全文搜索等 支付项目: 项目地址:https://gitee.com/52itstyle/spring-boot-pay 秒杀案例: 项目地 ...