目录
理解“Derived.prototype = new Base”中“new”的作用
'new' 的作用
继承的实例行为
正确的基于类的继承
利用现代 JavaScript 功能
调用父构造函数
首页 web前端 js教程 JavaScript 原型继承中'new”的作用是什么:'Derived.prototype = new Base”?

JavaScript 原型继承中'new”的作用是什么:'Derived.prototype = new Base”?

Dec 24, 2024 am 09:46 AM

What is the Role of `new` in JavaScript Prototypal Inheritance: `Derived.prototype = new Base`?

理解“Derived.prototype = new Base”中“new”的作用

考虑以下代码片段:

WeatherWidget.prototype = new Widget;

其中Widget 代表一个构造函数,我们的目标是使用名为 WeatherWidget 的新函数来扩展它。问题出现了:new 关键字在这种情况下的意义是什么?如果省略它会产生什么后果?

'new' 的作用

new 关键字执行关键操作通过将 Widget 实例化为构造函数并将其返回值分配给 WeatherWidget 的原型属性。如果不存在 new 关键字,则在不提供参数的情况下调用 Widget(例如,通过省略括号)将导致未定义的行为。此外,如果 Widget 的实现未设计为作为构造函数调用,则此方法可能会无意中污染全局命名空间。

继承的实例行为

通过使用所示的 new 关键字,所有实例WeatherWidget 将从同一个 Widget 实例继承,从而产生以下原型链:

[new WeatherWidget()] → [new Widget()] → [Widget.prototype] → …

这种特殊的安排可能适合以下情况:所有 WeatherWidget 实例都旨在共享从 Widget 实例继承的属性值。然而,在大多数情况下,这种共享继承是不可取的。

正确的基于类的继承

为了在使用原型的 JavaScript 中有效地实现基于类的继承,建议使用以下方法:

function Dummy () {}
Dummy.prototype = Widget.prototype;
WeatherWidget.prototype = new Dummy();
WeatherWidget.prototype.constructor = WeatherWidget;

该技术确保 WeatherWidget 实例通过原型链正确继承属性,但不会在实例之间共享属性值,因为它们从中间虚拟构造函数。这是生成的原型链:

[new WeatherWidget()] → [new Dummy()] → [Widget.prototype] → …

利用现代 JavaScript 功能

在遵循 ECMAScript 5 及更高版本的现代 JavaScript 实现中,首选以下方法:

WeatherWidget.prototype = Object.create(Widget.prototype, {
  constructor: {value: WeatherWidget}
});

这种方法的另一个好处是创建不可枚举、不可配置的构造函数

调用父构造函数

最后,需要注意的是,父构造函数(在本例中为 Widget)只会从子构造函数(WeatherWidget)中显式调用,类似如何使用 apply 或 call 方法:

function WeatherWidget (…)
{
  Widget.apply(this, arguments);
}

以上是JavaScript 原型继承中'new”的作用是什么:'Derived.prototype = new Base”?的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

热门话题

Laravel 教程
1602
29
PHP教程
1504
276
如何在node.js中提出HTTP请求? 如何在node.js中提出HTTP请求? Jul 13, 2025 am 02:18 AM

在Node.js中发起HTTP请求有三种常用方式:使用内置模块、axios和node-fetch。1.使用内置的http/https模块无需依赖,适合基础场景,但需手动处理数据拼接和错误监听,例如用https.get()获取数据或通过.write()发送POST请求;2.axios是基于Promise的第三方库,语法简洁且功能强大,支持async/await、自动JSON转换、拦截器等,推荐用于简化异步请求操作;3.node-fetch提供类似浏览器fetch的风格,基于Promise且语法简单

JavaScript数据类型:原始与参考 JavaScript数据类型:原始与参考 Jul 13, 2025 am 02:43 AM

JavaScript的数据类型分为原始类型和引用类型。原始类型包括string、number、boolean、null、undefined和symbol,其值不可变且赋值时复制副本,因此互不影响;引用类型如对象、数组和函数存储的是内存地址,指向同一对象的变量会相互影响。判断类型可用typeof和instanceof,但需注意typeofnull的历史问题。理解这两类差异有助于编写更稳定可靠的代码。

超越地图和过滤器的高阶功能的JS综述 超越地图和过滤器的高阶功能的JS综述 Jul 10, 2025 am 11:41 AM

JavaScript数组中,除了map和filter,还有其他强大且不常用的方法。1.reduce不仅能求和,还可计数、分组、展平数组、构建新结构;2.find和findIndex用于查找单个元素或索引;3.some和every用于判断是否存在或全部满足条件;4.sort可排序但会改变原数组;5.使用时注意复制数组避免副作用。这些方法使代码更简洁高效。

过滤JavaScript中的一系列对象 过滤JavaScript中的一系列对象 Jul 12, 2025 am 03:14 AM

JavaScript中filter()方法用于创建一个包含所有通过测试元素的新数组。1.filter()不修改原数组,而是返回符合条件元素的新数组;2.基本语法为array.filter((element)=>{returncondition;});3.可按属性值过滤对象数组,如筛选年龄大于30的用户;4.支持多条件筛选,例如同时满足年龄和名字长度条件;5.可处理动态条件,将筛选参数传入函数以实现灵活过滤;6.使用时注意必须返回布尔值,避免返回空数组,以及结合其他方法实现字符串匹配等复杂逻

如何检查数组是否在JavaScript中包含一个值 如何检查数组是否在JavaScript中包含一个值 Jul 13, 2025 am 02:16 AM

在JavaScript中检查数组是否包含某个值,最常用方法是includes(),它返回布尔值,语法为array.includes(valueToFind),例如fruits.includes('banana')返回true;若需兼容旧环境,则使用indexOf(),如numbers.indexOf(20)!==-1返回true;对于对象或复杂数据,应使用some()方法进行深度比较,如users.some(user=>user.id===1)返回true。

JavaScript上下文中解释的虚拟DOM的概念 JavaScript上下文中解释的虚拟DOM的概念 Jul 12, 2025 am 03:09 AM

虚拟DOM是一种优化真实DOM更新的编程概念,通过在内存中创建与真实DOM对应的树形结构,避免频繁直接操作真实DOM。其核心原理是:1.数据变化时生成新的虚拟DOM;2.对比新旧虚拟DOM找出最小差异;3.批量更新真实DOM以减少重排重绘开销。此外,使用唯一稳定key可提升列表对比效率,而部分现代框架已采用其他技术替代虚拟DOM。

在异步/等待JavaScript函数中处理错误 在异步/等待JavaScript函数中处理错误 Jul 12, 2025 am 03:17 AM

处理异步函数中的错误应使用try/catch、在调用链中处理、使用.catch()方法、并监听unhandledrejection事件。1.使用try/catch捕获错误是推荐方式,结构清晰且能处理await中的异常;2.在调用链中处理错误可集中逻辑,适合多步骤流程;3.使用.catch()可在调用async函数后捕获错误,适用于Promise组合场景;4.监听unhandledrejection事件可记录未处理的rejection,作为最后一道防线;以上方法共同确保异步错误被正确捕获和处理。

如何处理JavaScript中的时区? 如何处理JavaScript中的时区? Jul 11, 2025 am 02:41 AM

处理JavaScript时区问题的关键在于选择合适的方法。1.使用原生Date对象时,推荐以UTC时间进行存储和传输,并在展示时转换为用户本地时区;2.对于复杂时区操作,可使用moment-timezone,它支持IANA时区数据库并提供便捷的格式化与转换功能;3.若需本地化显示时间且不想引入第三方库,可使用Intl.DateTimeFormat;4.推荐现代轻量方案day.js配合timezone和utc插件,其API简洁、性能良好并支持时区转换。

See all articles