我的编程空间,编程开发者的网络收藏夹
学习永远不晚

图解js中的Object.create方法(附代码实例)

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

图解js中的Object.create方法(附代码实例)

ECMAScript 5 新增了 Object.create() 方法将原型式继承的概念规范化【推荐学习:JavaScript视频教程】

用法

var obj = Object.create({name: 'johan', age: 23}) // obj 继承了属性name 和 age
var obj2 = Object.create(null) // obj2 不继承任何属性和方法
var obj3 = Object.create(Object.prototype) // 与 {} 和 new Object() 一个意思
var obj4 = Object.create({}, {
    property1: {
        value: true,
        writable: true
    }
}) // 第二个参数与 Object.defineProperties() 一致
图解 Object.create 实现
function create(proto) {
    function F(){}
    F.prototype = proto
    return new F()
}

第一步: function F(){}

即创建一个函数,因为约定首字母大写,视为构造函数,创建函数 F 时,F 构造函数与和它的原型对象就有了这一层的关系:

F.prototype === F.prototype; // 假设你把F.prototype当作一个值
F.prototype.constructor === F;

1c137449b5dad8aa827e0d3d562ba16.jpg

第二步:F.prototype = proto

即将 F.prototype 赋值为传入的 proto,如此就打破了F.prototype = F.prototype 以及 F.prototype.constructor = F ,它们的关系为

cf1d8013b4b1389a14f99223d0649c0.jpg

第三步:return new F()

第三步的解读有点费解,因为这里涉及到 new 的操作,在 new 改变了对象 中我们说过,new 会创建一个对象,并将这个对象的隐式原型(__proto__) 指向构造函数的原型对象,并初始化构造函数,如果值则返回值。我们也会在后续的原型中介绍,new 是隐式原型继承,Object.create 是显式原型继承

在这里,我们按实现 new 的方式来解读 return new F()。new F 后的实例的 __proto__ 指向的是 F.prototype,而这个值已经在第二步时指给了传来的 proto,所以就有了new F().__proto__ = proto

a08a482b33e74d522dfff31c2f89f1e.jpg

或许你还是不太清楚第三步,我们结合例子,就一目了然了

var obj = Object.create({name: 'johan'})

第三步的图解就成了这样:

a43e4289d48caae8806477976238cff.jpg

这样就成了, obj 继承自{name: johan} 这个对象,至于F.prototype = {name: 'johan'},在调用完 Object.create 之后,也因为没人使用 F 函数而被引擎当作垃圾回收了,遂成了obj.__proto__ = {name: 'johan'}

如此「原型式继承」就被传承下来了

其原理就是如此,简单来说,就是创建空(构造)函数,关联它的原型(实现继承)

Object.create(null)

在阅读源码时,常会看到 Object.create(null) ,用此初始化一个新对象,至于为什么用这个方法而不用 new Object 或者 {},是因为无论 new 还是字面量,都是继承自 Object 构造函数,而使用Object.create(null) ,能得到一个没有任何继承痕迹的对象

var obj = Object.create(null)

不信,你可以打印 obj 试试

以上就是图解js中的Object.create方法(附代码实例)的详细内容,更多请关注编程网其它相关文章!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

图解js中的Object.create方法(附代码实例)

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

图解js中的Object.create方法(附代码实例)

​本文给大家介绍有关ECMAScript 5中 新增的Object.create() 方法,对于不了解的同学,欢迎收藏学习哟~
2022-11-25

java中zip压缩乱码解决方法(附代码)

用java来打包文件生成压缩文件,有两个地方会出现乱码(推荐:java基础教程)1、内容的中文乱码问题,这个问题网上很多人给出了解决方法,两种:修改sun的源码;使用开源的类库org.apache.tools.zip.ZipOutputStream和org.a
java中zip压缩乱码解决方法(附代码)
2020-12-29

js中写html代码的方法

这篇文章将为大家详细讲解有关js中写html代码的方法,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。在js中写html代码的方法:首先使用div标签创建一块区域,给div标签添加一个id属性;然后在js中
2023-06-15

java中的 toString()方法实例代码

前言: toString()方法 相信大家都用到过,一般用于以字符串的形式返回对象的相关数据。  最近项目中需要对一个ArrayList> datas 形式的集合处理。  处理要求把集合数据
2023-05-31

C#调用js库的方法示例代码

这篇文章主要介绍了C#调用js库的方法,本文结合示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
2023-01-17

Android中复制图片的实例代码

activity_main.xml中的配置2023-05-30

Android实现放大镜效果的方法实例(附源码)

前言 应该有很多用过英语应用的同学都看多一个放大镜的效果,就是选中一段文字后,会有一个放大镜,这个究竟怎么实现的呢,我们今天来分析分析。 源码分析public class ShaderView extends View {private f
2022-06-06

JS 中Proxy代理和 Reflect反射方法示例详解

这篇文章主要为大家介绍了JS 中Proxy代理和 Reflect反射方法示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
2022-11-13

Android 实现监听的四种方法详解实例代码

直接上代码,大家可以参考下 (1)自身类作为事件监听器package cn.edu.gdmec.s07150745.work5; import android.support.v7.app.AppCompatActivity; import
2022-06-06

Oracle中分割字符串的方法实例代码

目录1. 使用 regexp_substr() 函数1.1 方式11.2 方式21.3 注意问题(尤其是存储过程中用到,可能会入坑)2. 自定义函数2.1 自定义类型 table2.2 自定义函数2.2.1 自定义函数2.2.2 效果如下:
2023-02-15

编程热搜

目录