首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么*不*在JavaScript中"继承"/扩展来自Object?

这个问题涉及到JavaScript中的继承和原型链的概念。在JavaScript中,对象之间的继承是通过原型链来实现的。每个对象都有一个原型对象,当我们尝试访问一个对象的属性时,如果对象本身没有这个属性,JavaScript会沿着原型链向上查找,直到找到该属性或者到达原型链的末端。

在JavaScript中,Object类是所有对象的基类,它包含了一些通用的属性和方法,如toString()、valueOf()等。因此,我们可以认为所有的对象都继承自Object类。

然而,有时我们希望创建一个新的对象,它不继承自Object类,这是为什么不在JavaScript中"继承"/扩展来自Object的原因之一。

另一个原因是,在JavaScript中,我们可以使用null作为原型对象,这意味着我们可以创建一个没有任何属性和方法的对象,这种对象被称为“空对象”。例如:

代码语言:javascript
复制
const emptyObject = Object.create(null);

这种对象不会继承任何属性和方法,因此可以更加轻量级地使用。

总之,JavaScript中的对象可以继承自Object类,但在某些情况下,我们可能不希望这种继承关系,因为这可以让我们创建更加轻量级的对象,或者避免原型链中的潜在问题。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

为什么建议 Docker 跑 MySQL?

—1— 前言 容器的定义:容器是为了解决“切换运行环境时,如何保证软件能够正常运行”这一问题。...—2— 数据安全问题 不要将数据储存在容器,这也是 Docker 官方容器使用技巧的一条。容器随时可以停止、或者删除。当容器被rm掉,容器里的数据将会丢失。...目前腾讯云的 TDSQL 和阿里的 Oceanbase 都是直接部署物理机器,而非 Docker 。 —4— 状态问题 Docker 水平伸缩只能用于无状态计算服务,而不是数据库。...Docker 快速扩展的一个重要特征就是无状态,具有数据状态的都不适合直接放在 Docker 里面,如果 Docker 安装数据库,存储服务需要单独提供。...目前,腾讯云的 TDSQL(金融分布式数据库)和阿里云的 Oceanbase(分布式数据库系统)都直接运行物理机器上,并非使用便于管理的 Docker 上。

3K20

为什么建议 Docker 跑 MySQL?

数据安全问题 不要将数据储存在容器,这也是 Docker 官方容器使用技巧的一条。容器随时可以停止、或者删除。当容器被rm掉,容器里的数据将会丢失。...项目地址:https://github.com/YunaiV/onemall 状态问题 Docker 水平伸缩只能用于无状态计算服务,而不是数据库。...Docker 快速扩展的一个重要特征就是无状态,具有数据状态的都不适合直接放在 Docker 里面,如果 Docker 安装数据库,存储服务需要单独提供。...目前,腾讯云的TDSQL(金融分布式数据库)和阿里云的Oceanbase(分布式数据库系统)都直接运行物理机器上,并非使用便于管理的 Docker 上。...然而在 Docker 水平伸缩只能用于无状态计算服务,数据库并不适用。 难道 MySQL 不能跑容器里吗? MySQL 也不是全然不能容器化。

3.7K20

JavaScript ,什么时候使用 Map 或胜过 Object

JavaScript ,对象是很方便的。它们允许我们轻松地将多个数据块组合在一起。 ES6之后,又出了一个新的语言补充-- Map。...因此,Map 在当今的 JavaScript 社区仍然没有得到充分的使用。 本文本,我会列举一些应该更多考虑使用 Map 的一些原因。...为什么对象不符合 Hash Map 的使用情况 Hash Map 中使用对象最明显的缺点是,对象只允许键是字符串和 symbol。...不过,我们可以通过使用 Object.create(null) 来解决这个问题,它可以生成一个继承Object.prototype的对象。...性能差异 JavaScript 社区,似乎有一个共同的信念,即在大多数情况下,Map 要比 Object 快。有些人声称通过从 Object 切换到 Map 可以看到明显的性能提升。

1.9K40

为什么建议 Docker 跑 MySQL Redis

为什么建议 Docker 跑 MySQL Redis ? 容器的定义:容器是为了解决“切换运行环境时,如何保证软件能够正常运行”这一问题。...状态问题 Docker 打包无状态服务是很酷的,可以实现编排容器并解决单点故障问题。但是数据库呢?将数据库放在同一个环境,它将会是有状态的,并使系统故障的范围更大。... Docker 水平伸缩只能用于无状态计算服务,而不是数据库。...Docker 快速扩展的一个重要特征就是无状态,具有数据状态的都不适合直接放在 Docker 里面,如果 Docker 安装数据库,存储服务需要单独提供。...因为数据匹配,新实例不会与现有的实例兼容,如果要限制实例使用单机服务,应该让 DB 使用非容器化环境,我们仅仅需要为计算服务层保留弹性扩展的能力。

12510

Vue 为什么推荐用 index 做 key

本文首发于政采云前端团队博客: Vue 为什么推荐用 index 做 key https://zoo.team/article/vue-index 前言 前端开发,只要涉及到列表渲染,那么无论是...key diff 算法的角色 其实在 React,Vue diff 算法大致是差不多,但是 diff 比对方式还是有较大差异的,甚至每个版本 diff 都大有不同。...下面我们就以 Vue3.0 diff 算法为切入点,剖析 key diff 算法的作用 具体 diff 流程如下 Vue3.0 patchChildren 方法中有这么一段源码 if (...官方解释:一个给定的数组,找到一组递增的数值,并且长度尽可能的大。...成员构成既有来自于阿里、网易的“老”兵,也有浙大、中科大、杭电等校的应届新人。

1.2K20

JavaScript的原型继承使用存在的安全问题

JavaScript的原型很多人都知道也很好用,但是很多人在使用原型继承中导致的安全问题却很少人知道,接下来我们就来好好了解一下。...真实开发,我们经常会在代码中使用Property accessors 属性访问器,并且使用用户输入的参数去访问某个对象的属性。...这看起来可能是一个很稀疏平常的操作,但是往往在这个过程我们的代码就已经产生了一个很大的安全漏洞!!!为什么这样写代码会产生安全问题?...// object代码运行时被创建// 假设数据的获取来自数据库const getRoles = () => ({ canAccessThat: true })const userCanAccessThis...代码减少属性访问器的使用尽可能使用.的方式去访问对象的属性或者使用 Map或Set,来代替我们的对象检查对象的原型链,查看新创建对象的原型是否被恶意添加了原本不该有的属性,或者属性被修改检查用户的输入

17711

设计原则为什么反复强调组合要优于继承

原作者:Kevin.ZhangCG面向对象编程,有一条非常经典的设计原则,那就是:组合优于继承,多用组合少用继承。...同样地,《阿里巴巴Java开发手册》中有一条规定:谨慎使用继承的方式进行扩展,优先使用组合的方式实现。为什么推荐使用继承  每个人在刚刚学习面向对象编程时都会觉得:继承可以实现类的复用。...所有更细分的鸟,比如麻雀、鸽子、乌鸦等,都继承这个抽象类。我们知道,大部分鸟都会飞,那我们可不可以 AbstractBird抽象类,定义一个fly()方法呢?  答案是否定的。...,我们可以接口中写默认实现方法。...这恰好反映了继承面向对象编程的大部分场景下的尴尬处境。

75920

设计原则为什么反复强调组合要优于继承

面向对象编程,有一条非常经典的设计原则,那就是:组合优于继承,多用组合少用继承。同样地,《阿里巴巴Java开发手册》中有一条规定:谨慎使用继承的方式进行扩展,优先使用组合的方式实现。 ?...为什么推荐使用继承   每个人在刚刚学习面向对象编程时都会觉得:继承可以实现类的复用。所以,很多开发人员需要复用一些代码的时候会很自然的使用类的继承的方式,因为书上就是这么写的。...所有更细分的鸟,比如麻雀、鸽子、乌鸦等,都继承这个抽象类。我们知道,大部分鸟都会飞,那我们可不可以 AbstractBird抽象类,定义一个fly()方法呢?   答案是否定的。...,我们可以接口中写默认实现方法。...这恰好反映了继承面向对象编程的大部分场景下的尴尬处境。

2.1K10

面试官:为什么系统推荐双写?

阿 雄:"我叫阿雄,来自某a国际电商公司!" 面试官:"我看你项目里用了elasticsearch,你是怎么同步数据的呢?"...思考第一个问题1、database,redis,elasticsearch,hadoop的数据是有关系的,还是彼此独立的?显然是有关系的,在这几个数据源的数据都是相关的。只是格式不一样而已!...一种比较简单且容易想到的方案是,hardcode程序 例如现在有两个数据源DataSouce1和DataSource2,我们往里头写数据,代码如下 ProductService{     \\省略...因为写入顺序已经消息队列定义好,各数据源按照消息队列的消息顺序,恢复数据即可,并不存在竞争现象。因此,不会出现不一致的问题!原子性问题OK,这种情况下,如果写入DataSource失败会怎么样?...如下图所示 该图中的中间件,例如oracle的oracle golden gate可以提取数据变化。mysql的canal能提取数据的变化。至于消息队列,可以选用kafka。

2.3K10

什么是线程组,为什么 Java 推荐使用?

在线程组,如果发生未捕获异常,可以通过 Thread.UncaughtExceptionHandler 进行处理。 Java ,虽然线程组是一种功能强大的机制,但实际上并不推荐使用。...下面主要从以下几个方面说明: 1、难以扩展 平常的开发,当我们需要对线程进行动态调度时,线程组往往过于笨重,这导致了代码难以扩展。...3、容易引起歧义 Java ,虽然 ThreadGroup 的设计旨在通过将一组线程分到同一个容器来轻松管理和控制它们,但如果使用错误,可能会导致线程状态。...因此, Java ,线程组已基本过时,推荐使用 Executor 框架等新的更实用的工具来进行线程管理。... JDK8之后,API也推出了更加强大的CompletionService接口,它能够执行更为复杂的异步任务并得到结果,这极大地扩展了Java多线程编程的功能性。

25420

Java 为什么推荐 while 循环中使用 sleep()

前言最近逛 CSDN 看到一篇文章,文章大意是说为什么循环中推荐使用 sleep 操作,原因在于线程挂起和唤醒会有很大的性能消耗,并推荐使用 Timer 及 ScheduledExecutorService...可能会导致忙等待 // 如 FLAG 变量状态未改变 那么线程可能一直循环,并不断进行线程挂起和唤醒原因是否正确主要原因和原文博主所说有很大的关系但不完全正确:我们都知道 Java 线程实际对应着操作系统的一个线程...方案是否合理记住一点,讨论方案永远不能脱离场景,没有一种方案可以适应所有的场景,我们永远只是探讨适合当前场景的方案。...比如微服务体系,客户端上报实例状态,或者服务端检测客户端状态都会使用定时轮询的机制。... Java AQS 等待获取锁和线程池任务为空等待新任务时,会使用等待和唤醒操作轮询机制 和 等待和唤醒 一般会结合使用,避免线程频繁的挂起和唤醒。

70130

为什么空合并运算符 (??) JavaScript 至关重要?

JavaScript开发者都曾经有过这样的经历——使用变量之前必须检查它是否为null或undefined。这导致了许多重复的条件检查,可能会使我们的代码变得混乱不堪。...随着ECMAScript 2020引入了nullish coalescing(空值合并)操作符,我们现在有了一种更清晰的处理null或undefined值的方式。...本文中,我将解释nullish coalescing操作符是什么,演示如何使用它,并讨论为什么它是JavaScript语言中如此重要的一个部分。Nullish Coalescing操作符是什么?...是ECMAScript 2020引入的逻辑运算符,用于处理null或undefined的默认值。它返回第一个操作数,如果它不是null或undefined。否则,它返回第二个操作数。...为何对于清晰的代码而言是必不可少的nullish coalescing操作符之所以对于编写清晰的JavaScript代码至关重要,有一些关键原因:避免重复的条件判断:正如前面提到的,它消除了代码中使用多个

18240

深入理解javascript继承机制 之 12种继承模式总结原型链法仅从原型继承临时构造器原型属性拷贝所有属性拷贝(浅拷贝)深拷贝原型继承扩展与增强模式多重继承法寄生式继承借用构造函数:构造器于

之前我们介绍了多种javascript继承方式,最后我们开始总结概括这些继承方式,先将javascript继承分类,根据不同的条件,可以分成不同的类别。...最常用的我们可以分为这两类: 基于构造器的继承模式 基于对象的继承模式 或者我们也可以如下分类: 是否使用原型 是否使用了属性拷贝 即使用了原型,也使用了属性拷贝 下面我们就来总结回顾一下javascript...继承模式 原型链法 示例: Child.prototype = new Parent(); 分类: 使用了原型 基于构造器的继承模式 ** 注意 **: 默认的继承机制 我们可以将需要重用的属性和方法移到原型...,自身属性和方法是继承的 通过uber可以方便的访问到父对象 原型属性拷贝 实例: function extend2(Child,Parent) { var p = Parent.prototype;...); 分类: 基于构造器模式 使用原型链 属性拷贝 ** 注意 ** 借用构造器与原型属性拷贝的结合 允许不重复调用父对象构造器的情况下同时继承自身属性和原型属性

45320

「思维导图学前端 」一文搞懂Javascript对象,原型,继承

javascript,对象属性查询非常灵活,支持点号查询,也支持字符串索引查询(之所以说是“字符串索引”,是因为写法看起像数组,索引是字符串而不是数字)。...所以,大家应该也明白了为什么不能使用__proto__了吧。 原型链 javascript,任何对象都有原型,除了Object.prototype,它没有原型,或者说它的原型是null。...很明显,第三个来源不是用来做继承的,那么前两个来源用来做继承分别有什么优缺点呢?很明显,如果只基于其中一种来源做继承,都不可能全面地继承来自父类的属性或方法。...寄生式继承 寄生式继承有借鉴工厂函数的设计模式,将继承的过程封装到一个函数并返回对象,并且可以函数扩展对象方法或属性。...缺点:如果在工厂函数扩展对象属性或方法,无法得到复用。 寄生组合继承 用以解决组合继承过程存在的“父类构造函数多次被调用”问题。

72820

前端入门13-JavaScript进阶之原型声明正文-原型

但是,JavaScript 的关于实例、继承等这些跟 Java 还是有很大的区别。...这也是为什么会在对象一节说,所有通过直接量方式创建的对象都继承Object.prototype 的理由。...所以, JavaScript ,绝大部分的对象都有原型,即使手动指定,也会有默认的内置原型对象。...这也是为什么函数对象、数组对象、普通对象都可以使用一些内置的方法,因为创建这些对象的时候,默认就会有一些继承关系,跟 Java 中所有的类都继承Object 的机制类似。...所以, JavaScript 有一种编程理念:鸭式辩型 鸭式辩型 我不是很理解中文翻译为什么是这个词,应该是某个英文词直译过来的。 它的理念是:像鸭子一样走路、游泳、嘎嘎叫的鸟就称它为鸭子。

62030

深入理解JavaScript原型:prototype,__proto__和constructor

本文结合笔者开发工作遇到的问题详细讲解JavaScript原型的几个关键概念,如有错误,欢迎指正。 1. JavaScript原型继承 提到JavaScript原型,用处最多的场景便是实现继承。...它的getter方法为Object.getPrototypeOf(),这个方法ES5就已经有了;setter方法为Object.setPrototypeOf()。...但是判断继承关系时发现,得到的结果令人困惑,为什么(childA instanceof ChildB返回true呢?...前文提到,创建了构造函数便是创建了同名类,随后改变一个对象的原型时,只是改变了类的这个属性,而构造函数是类的静态成员,保持不变。 另外,修改对象原型时,建议使用直接赋值的方式。...(Animal.prototype,{ constructor: Cat }); var cat_1 = new Cat(); 结合其他OO语言的继承方式和JavaScript原型理解上述代码: 扩展

77980
领券