1.对象的概念

  JavaScript只有函数对象才有类的概念,因此创建一个对象,必须使用函数对象。(ES6中可以直接声明一个class,实质上也是一个函数对象)。

函数对象的内部有[[Construct]]方法和[[Call]]方法。[[Construct]]用于构造对象,[[Call]]用于函数调用。当使用 new 操作符的时候才会触发[[Construct]]

逻辑。var obj = new Object();调用Object()构造函数创建实例对象,var obj = {};是有js引擎直接生成的实例对象,不调用[[Construct]]逻辑,效率更高。

2.对象创建过程

  var obj = new  Fn(args);用户自定义构造函数实例化对象。

new Fn(args):使用new操作符时触发Fn 的[[Construct]]逻辑,创建对象的步骤如下:

1.  创建一个build-in object对象obj(实例对象);

   (并完成内部必要的初始化,它的[[Class]]、[[Extensible]]、[[Prototype]]等属性应当为null或者内部初始化值。)

2.  设置obj的内部属性[[class]]为"Function",或者其它本地类型,例如:"Number"、"String"、"Boolean"等。这是由构造函数的类型决定的。

3.  设置obj的内部属性[[Extensible]]为 true。

4.  如果Fn.prototype是object引用对象类型,则将obj的内部[[Prototype]]设置为Fn.prototype,否则obj的[[Prototype]]将为其初始化值(即Object.prototype)

  备注:重写原型链导致实例对象隐式原型指向问题(实例对象隐式原型会初始化为Object.prototype)

5.  将obj作为this,使用args参数调用Fn的内部[[Call]]方法。(this.[[Call]](args))

  5.1 创建内部[[Call]]方法的当前执行环境(当前执行环境压入执行环境栈)

    (函数体内function定义的方法的[[Scope]]静态作用域复制到[[Call]]的作用域链,在作用域链的前端添加[[Call]]的活动对象;this引用obj)

  5.2 调用Fn的函数体

  5.3 销毁当前的执行环境(当前执行环境弹出执行环境栈)

  5.4 返回Fn函数体的返回值,如果Fn的函数体没有返回值则返回undefined

6. 如果返回值是object引用对象类型,则返回这个值;否则(返回值是基本类型)则返回obj

  函数类型对象的创建会把prototype属性的[[Prototype]]设置为Object.prototype,这个过程就是按照上边步骤走一遍,这样默认情况下我们创建自定义函数的实例对象时,它们的Prototype链终将指向Object.prototype。

注意步骤4中, prototype指Fn对象显示的prototype属性,而[[Prototype]]则代表对象内部隐式Prototype属性。

  实例对象Prototype链的是内部隐式的[[Prototype]](原型链),而并非对象显示的prototype属性。显示的prototype只有在函数对象上才有意义,从上面的创建过程可以看到,函数的prototype被赋给实例对象隐式[[Prototype]]属性,这样根据Prototype规则,实例对象和函数的prototype对象之间才存在属性、方法的继承/共享关系。

3.JavaScript对象模型

注释: 红色虚线表示隐式的原型链

   

Prototype链的补充说明:
  1.  Object.prototype是整个链的终结点,它的内部[[Prototype]]为null。
  2.  所有函数的[[prototype]]链都指向Function.prototype。

  Function的Prototype链指向Function.prototype,这是规范要求的,因为设计者将Function设计为具有自举性。Function的Prototype链这样设计之后,Function.constructor==Function, Function instanceOf Function都为true。另外Function已经是最顶层的构造器,但Function本身也是一个函数对象,它必然是由某个东西创建出来的,这样自举在语义上合情合理。
Function.prototype的[[prototype]]链指向Object.prototype,这也是规范强制要求的。首先Function.prototype是Function的一个实例对象(typeof

Function.prototype可以知道它是一个Function,instanceOf无法通过测试,因为Prototype链在内部被额外设置了),所以按照Prototype的规则,Function.prototype的prototype值应当为Function.prototype这个对象,即它的Prototype链指向自己本身。这样一方面在Prototype链上造成一个死循环,另一方面它本身成为了一个终结点,结果就是所有函数对象将不是派生自Object了。加上这个强制要求之后,Prototype链只有唯一的一个终结点。

JavaScript对象模型概念的更多相关文章

  1. JavaScript对象模型-执行模型

    数据类型基本数据类型基本数据类型是JS语言最底层的实现.简单数值类型: 有Undefined, Null, Boolean, Number和String.注意,描述中的英文单词在这里仅指数据类型的名称 ...

  2. JavaScript基本概念(二)

    JavaScript 基本概念(二) 操作符和语句 目录 操作符 一元操作符 位操作符 布尔操作符 乘性操作符 其他操作符 语句部分 说起操作符,回忆下上一篇文章末尾说的话. 操作符 一元操作符 ++ ...

  3. 《JavaScript核心概念》基础部分重点摘录

    注:<JavaScript核心概念>适合深入了解JavaScript,比我买的<JavaScript框架设计>语言和内容丰富多了(可能是我水平尚浅吧). 1. 作用域 var ...

  4. BEGINNING SHAREPOINT&#174; 2013 DEVELOPMENT 第11章节--为Office和SP解决方式开发集成Apps Office的JavaScript对象模型

    BEGINNING SHAREPOINT® 2013 DEVELOPMENT 第11章节--为Office和SP解决方式开发集成Apps  Office的JavaScript对象模型         ...

  5. JavaScript的概念,引入,基本数据类型

    08.05自我总结 JavaScript 一.概念 JavaScript(下文我们会用简称JS来代替)是脚本编程语言,JS语言开发的文件是以.js为后缀,通过在html文件中引入该js文件来控制htm ...

  6. js-js实现,在HTML中使用JavaScript,基本概念

    Js实现: 1.JavaScript实现的组成: 核心(ECMAScript):由ECMA-262定义,提供核心语言功能 文档对象模型(DOM)提供访问和操作网页内容的方法以及接口 浏览器对象模型(B ...

  7. Javascript单例模式概念与实例

    前言 和其他编程语言一样,Javascript同样拥有着很多种设计模式,比如单例模式.代理模式.观察者模式等,熟练运用Javascript的设计模式可以使我们的代码逻辑更加清晰,并且更加易于维护和重构 ...

  8. SharePoint 2013 使用JavaScript对象模型配置智能提示

    前言 默认在VS2012/2013中编写SharePoint JavaScript 客户端对象模型,都没有智能感知的功能,用起来非常麻烦:其实,我们可以手动配置一下,让JavaScript可以进行智能 ...

  9. 转:深入理解JavaScript闭包概念

    闭包向来给包括JavaScript程序员在内的程序员以神秘,高深的感觉,事实上,闭包的概念在函数式编程语言中算不上是难以理解的知识.如果对作用域,函数为独立的对象这样的基本概念理解较好的话,理解闭包的 ...

随机推荐

  1. airtest通过包名直接打开app的方法

    工具提供直接打开APP的函数 #输入微信包名,打开微信 start_app("com.tencent.mm")

  2. 使用shiro 框架 报错No WebApplicationContext found: no ContextLoaderListener or DispatcherServlet registered?

    1.问题描述:ssm 框架中使用shiro  中出现问题 原来web.xml 文件如下: <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, ...

  3. jdk8 ConcurrentHashMap分析

    ConcurrentHashMap分析 tryPresize() transfer() putVal() addCount() sumCount() class ConcurrentHashMap { ...

  4. Spring框架学习笔记(9)——API接口设计相关知识及具体编码实现

    最近需要设计一个API服务器,想要把API接口搞得规范一下,就通过网上搜集到了一些资料,以下便是自己的一些理解以及相关的具体实现 本文采用的是spring boot+maven的方案 restful规 ...

  5. 把"重试"抽象出来做个工具类吧

    背景介绍 我们在工作中难免会写一些重复性的代码,所以需要我们具备一定的抽象能力,比如把共同的逻辑抽取到抽象类中,也可以通过一些工具类来避免冗余代码 今天这篇文章就是把一个调用服务的重试功能抽取出一个工 ...

  6. ORB-SLAM2 初体验 —— 配置安装

    转载请注明出处,谢谢 原创作者:MingruiYU 原创链接:https://www.cnblogs.com/MingruiYu/p/12286752.html ORB-SLAM2作为目前应用最广泛的 ...

  7. 用Python在Linux下调用新中新DKQ-A16D读卡器,读二代证数据

    1.背景 最近在研究二代证读卡器,手头上的设备是新中新DKQ-A16D,在官网(https://www.onecardok.com.cn/download)逛了一圈,发现Win下的示例,浏览器插件很多 ...

  8. Pycharm2019.1.1永久破解

    声明:不做商业用途,电脑系统win10专业版,亲测有效. 1,下载新版破解补丁+安装包 网盘链接 提取码:hn0u 下载补丁文件 jetbrains-agent.jar 并将它放置到 pycharm安 ...

  9. tomcat 多端口 多容器 多域名 配置

    先强调一个原则: server下面可以有多个service,用于配置不同监听端口 service下面可以有多个Host,用于配置该端口下的不同域名 Host里可以包含多个Context,用于配置该端口 ...

  10. Zookeeper 应用实例

    配置管理 程序总是需要配置的,如果程序分散部署在多台机器上,要逐个改变配置就变得困难.好吧,现在把这些配置全部放到zookeeper上去,保存在 Zookeeper 的某个目录节点中,然后所有相关应用 ...