JavaScript对象模型概念
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对象模型概念的更多相关文章
- JavaScript对象模型-执行模型
数据类型基本数据类型基本数据类型是JS语言最底层的实现.简单数值类型: 有Undefined, Null, Boolean, Number和String.注意,描述中的英文单词在这里仅指数据类型的名称 ...
- JavaScript基本概念(二)
JavaScript 基本概念(二) 操作符和语句 目录 操作符 一元操作符 位操作符 布尔操作符 乘性操作符 其他操作符 语句部分 说起操作符,回忆下上一篇文章末尾说的话. 操作符 一元操作符 ++ ...
- 《JavaScript核心概念》基础部分重点摘录
注:<JavaScript核心概念>适合深入了解JavaScript,比我买的<JavaScript框架设计>语言和内容丰富多了(可能是我水平尚浅吧). 1. 作用域 var ...
- BEGINNING SHAREPOINT® 2013 DEVELOPMENT 第11章节--为Office和SP解决方式开发集成Apps Office的JavaScript对象模型
BEGINNING SHAREPOINT® 2013 DEVELOPMENT 第11章节--为Office和SP解决方式开发集成Apps Office的JavaScript对象模型 ...
- JavaScript的概念,引入,基本数据类型
08.05自我总结 JavaScript 一.概念 JavaScript(下文我们会用简称JS来代替)是脚本编程语言,JS语言开发的文件是以.js为后缀,通过在html文件中引入该js文件来控制htm ...
- js-js实现,在HTML中使用JavaScript,基本概念
Js实现: 1.JavaScript实现的组成: 核心(ECMAScript):由ECMA-262定义,提供核心语言功能 文档对象模型(DOM)提供访问和操作网页内容的方法以及接口 浏览器对象模型(B ...
- Javascript单例模式概念与实例
前言 和其他编程语言一样,Javascript同样拥有着很多种设计模式,比如单例模式.代理模式.观察者模式等,熟练运用Javascript的设计模式可以使我们的代码逻辑更加清晰,并且更加易于维护和重构 ...
- SharePoint 2013 使用JavaScript对象模型配置智能提示
前言 默认在VS2012/2013中编写SharePoint JavaScript 客户端对象模型,都没有智能感知的功能,用起来非常麻烦:其实,我们可以手动配置一下,让JavaScript可以进行智能 ...
- 转:深入理解JavaScript闭包概念
闭包向来给包括JavaScript程序员在内的程序员以神秘,高深的感觉,事实上,闭包的概念在函数式编程语言中算不上是难以理解的知识.如果对作用域,函数为独立的对象这样的基本概念理解较好的话,理解闭包的 ...
随机推荐
- [HAOI2015]树上操作(树链剖分)
[HAOI2015]树上操作(luogu) Description 题目描述 有一棵点数为 N 的树,以点 1 为根,且树点有边权.然后有 M 个操作,分为三种: 操作 1 :把某个节点 x 的点权增 ...
- Python和JS实现的Web SSH工具webssh,牛逼
这个工具是使用Python开发,可以从下面地址了解详情. 官网:https://pypi.org/project/webssh/ webssh这个工具可以干啥: 在linux机器上安装python环境 ...
- Android教程2020 - RecyclerView实际使用
示例,用RecyclerView的item做出一个列表. Android教程2020 - 系列总览 本文链接 前面我们已经知道如何用RecyclerView显示一列数据.这里我们做出一个具体的例子.尽 ...
- jQuery使用ajax向node后台发送对象、数组参数
引言 最近在使用jq,做一些小demo,但是突然发现jq使用ajax像后台(node)传递一个对象参数,但是后台却接收不了. 原因 后面了解到.jq会将一个对象解析成obj[key]: value这样 ...
- springboot打印sql语句及执行时间
有时候我们程序的接口比较耗时,需要优化,这时我们可能需要了解该接口执行了哪些sql语句以及耗时 1.引入jar包 <!--监控sql日志--> <dependency> < ...
- Plant Simulation打包与分享
作者:iJonas 本人原创,转载说明出处. 公众号:仿真社区Plant Simulation 关注知乎专栏:iJonas 目录 简介 使用方法 注意 1.简介 很多情况下,我们需要把模型发送给客户. ...
- Arduino系列之按键模块(一)
今天我将简单介绍按键模块计数的原理: 我们常用的按键及按键模块有2脚和4脚的,其内部结构如图所示,当按下按键时就会接通按键两端,当放开时,两端自然断开. ...
- ceph问题
问题1: [root@admin-node my-cluster]# ceph -s cluster 4ca35731-2ccf-47fb-9f06-41fae858626d health HEALT ...
- permission denied (publickey)问题的解决和向github添加ssh key
使用ssh key这种方式进行clone ,pull github上面的项目,使用 git clone或者git pull origin master出现permission denied (publ ...
- GetModuleFileNameEx遍历获取64bit程序路径失败的一种解决方法(Win7-64-bit)
问题: 32位程序在64位系统上调用GetModuleFileNameEx()遍历获取64位进程的全路径失败,得到的路径都为空. 根据官方的说法: For the best results use t ...