JavaScript原型与原型链深入浅出_javascript技巧

原型是函数的prototype属性指向的对象,每个对象通过[[Prototype]]链接向上查找属性,形成原型链:p1→Person.prototype→Object.prototype→null,实现继承与共享。

javascript原型与原型链深入浅出_javascript技巧

JavaScript中的原型与原型链是理解对象继承和属性查找机制的核心。很多人初学时觉得抽象,其实只要抓住几个关键点,就能快速掌握它的运行逻辑。

什么是原型(Prototype)?

在JavaScript中,每一个函数创建时都会自动生成一个prototype属性,这个属性指向一个对象,称为“原型对象”。而每个对象(除部分特殊情况外)都有一个内部属性[[Prototype]],它指向其构造函数的prototype。

例如:

function Person(name) {
  this.name = name;
}

Person.prototype.sayHello = function() {
  console.log(“Hello, I’m ” + this.name);
};

const p1 = new Person(“Alice”);
p1.sayHello(); // 输出: Hello, I’m Alice

立即学习“Java免费学习笔记(深入)”;

这里,p1本身没有sayHello方法,但它能调用,是因为JavaScript通过原型找到了Person.prototype上的该方法。

原型链:属性查找的路径

当访问一个对象的属性时,JavaScript会先检查对象自身是否有这个属性。如果没有,就会沿着[[Prototype]]链向上查找,直到找到匹配属性或到达原型链末端(即null)。

比如:

百川大模型 百川大模型

百川智能公司推出的一系列大型语言模型产品

百川大模型 62 查看详情 百川大模型 p1.toString() —— p1没有toString,但它的构造函数原型继承自Object.prototype,所以能找到。 这条查找路径就是:p1 → Person.prototype → Object.prototype → null

这就是原型链的本质:一条由[[Prototype]]连接起来的对象链条。

如何查看和设置原型?

现代JavaScript提供了几个常用方法来操作原型:

Object.getPrototypeOf(obj) —— 获取对象的原型 Object.setPrototypeOf(obj, prototype) —— 设置对象的原型(性能较低,慎用) obj.__proto__ —— 非标准但广泛支持的访问方式(可读可写) Object.create(prototype) —— 创建一个新对象,并指定其原型

推荐使用Object.getPrototypeOf和Object.create来保证代码的规范性和兼容性。

常见误区与实用技巧

理解原型链时,有几个容易混淆的地方:

prototype是函数才有的属性;而[[Prototype]]是每个对象都有的内部链接 箭头函数没有prototype属性 使用class语法定义的类,底层依然是基于原型实现的

小技巧:如果你想让多个实例共享某个方法或数据,把它挂到prototype上,而不是定义在构造函数内部,这样更节省内存。

基本上就这些。原型不是魔法,只是JavaScript对象之间通过链接共享属性和方法的一种机制。搞清楚谁连着谁,查找顺序是什么,自然就通了。不复杂但容易忽略细节。

以上就是JavaScript原型与原型链深入浅出_javascript技巧的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/293595.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年11月4日 21:39:21
下一篇 2025年11月4日 21:40:32

相关推荐

  • 对象复用与内存优化实践

    对象复用与内存优化通过对象池、不可变对象、享元模式及避免临时对象滥用,结合JVM特性与监控手段,减少GC压力并提升性能。 在软件开发中,对象复用和内存优化是提升系统性能、降低资源消耗的关键手段。尤其在高并发或资源受限的场景下,合理管理对象生命周期能显著减少GC压力、缩短响应时间。核心思路不是每次需要…

    2025年12月16日
    000
  • 使用Go语言设置浏览器Cookie的全面指南

    本文详细介绍了如何在go语言中使用`net/http`包来正确设置浏览器cookie。我们将从`http.cookie`结构体的初始化,到利用`http.setcookie`函数将cookie发送给客户端浏览器进行深入讲解,并提供完整的示例代码和关键注意事项,帮助开发者避免常见错误,确保cookie…

    2025年12月16日
    000
  • Go SWIG 示例代码构建指南及常见问题解决

    本文详细介绍了如何构建 go 语言中 swig 示例代码,特别是针对 `misc/swig/callback` 目录下的示例。教程涵盖了环境变量配置、使用 `go install` 命令进行编译的步骤,并重点提供了解决 `g++` 编译错误的方法,包括确保 `g++` 及其相关多架构库的正确安装与验…

    2025年12月16日
    000
  • Golang使用go test-vv查看详细测试信息

    go test -v 可显示测试执行详情,如用例运行状态与耗时,但无 -vv 参数;通过 -v 结合 -cover、-race 等参数可增强输出,t.Log 配合 -v 还能输出调试日志,满足多数调试需求。 在 Go 语言中,使用 go test -v 可以查看测试的详细输出,但并不存在 -vv 这…

    2025年12月16日
    000
  • Golang如何实现WebSocket数据收发

    Go语言通过gorilla/websocket库实现WebSocket通信,首先使用go get安装依赖,然后创建Upgrader实例将HTTP连接升级为WebSocket,示例代码展示了服务端接收并回显消息的过程,客户端可用JavaScript测试连接,关键点包括允许跨域、读写消息及连接关闭,适用…

    2025年12月16日
    000
  • Go App Engine中解决模板文件未找到的路径问题

    在Go App Engine开发中,遇到`panic: open templates/base.html: The system cannot find the path specified`错误是常见的模板文件加载问题。本文将深入探讨Go App Engine的文件访问机制,特别是`app.yam…

    2025年12月16日
    000
  • Go Gorilla Sessions:解决重定向后会话丢失的路径配置问题

    本文探讨了在使用 `gorilla/sessions` 包实现 go web 应用会话管理时,重定向后会话数据丢失的常见问题。核心原因在于 cookie 的路径(path)属性未正确配置,导致浏览器在重定向后的请求中不发送会话 cookie。解决方案是显式设置 `session.options.pa…

    2025年12月16日
    000
  • Golang中大括号放置规则解析:自动分号插入机制的深远影响

    go语言强制要求左大括号与语句同行,而非独立成行,这并非单纯的风格偏好,而是其独特的自动分号插入(asi)机制所致。该机制在词法分析阶段自动插入分号,以简化语法并提高可读性,但因此也强制了特定的代码格式,确保了代码风格的统一性,并避免了潜在的语法歧义。 Go语言的自动分号插入(ASI)机制 Go语言…

    2025年12月16日
    000
  • Go语言链式系统调用中的错误处理:模式、权衡与实践

    本文深入探讨Go语言中处理一系列系统调用时遇到的错误处理挑战。通过分析Go显式错误返回模式与传统异常机制的异同,阐述Go设计哲学在提供精细化错误控制和清晰错误路径方面的优势,同时指出其在某些场景下可能带来的代码冗余,并探讨了panic及函数式编程中Either模式的关联性,旨在帮助开发者更好地理解和…

    2025年12月16日
    000
  • 解决Go语言godoc命令失效或文件缺失问题

    本文旨在解决go语言开发中`godoc`命令无法正常运行的问题,特别是当遇到“no such file or directory”错误时。我们将详细介绍如何通过`go install`命令正确安装`godoc`工具,确保其所有依赖文件和html模板被正确下载和编译。通过遵循本文的步骤,开发者可以恢复…

    2025年12月16日
    000
  • Go语言Web开发:深入理解与实践HTTP Cookie设置

    本教程旨在指导go开发者如何在浏览器中正确设置http cookie。文章将纠正常见的`req.addcookie`误用,详细阐述`net/http`包中`http.setcookie`函数的正确用法,并提供一个完整的示例代码,帮助读者掌握cookie的创建、配置及其在web应用中的实际应用,确保客…

    2025年12月16日
    000
  • 将Windows 8 C/Go/HTML程序部署到平板电脑的可行性分析

    本文旨在探讨将基于C/Go/HTML编写的Windows 8程序部署到平板电脑上的可行性。该程序包含C编写的后端,通过动态加载32位DLL与硬件交互,并使用Go构建本地服务器,通过WebSocket与JavaScript/HTML前端通信。文章将重点分析平板电脑的操作系统类型、处理器架构、驱动兼容性…

    2025年12月16日
    000
  • 前端静态文件压缩与性能优化

    前端性能优化需从压缩、加载与缓存三方面入手。1. 使用 Terser、CSSNano、html-minifier 压缩代码,启用 Gzip/Brotli 传输压缩,图片转 WebP 并裁剪;2. 通过 Webpack 等工具实现代码分割与懒加载,合并小资源为雪碧图或 base64 内联,避免过大 b…

    2025年12月16日
    000
  • 标题:在Windows平板电脑上运行C/Go/HTML程序

    本文探讨了在Windows平板电脑上运行基于C/Go/HTML混合编程的应用程序的可行性。该程序包含C编写的后端,负责动态加载32位DLL文件与硬件通信,并通过本地服务器与前端JavaScript/HTML交互。文章分析了Windows平板电脑的类型(Windows 8 vs Windows RT)…

    2025年12月16日
    000
  • Go 语言中如何查询通道(Channel)缓冲区中的消息数量及容量管理

    go 语言的并发编程中,通道(channel)是核心组件。本文将介绍如何利用内置的 `len()` 和 `cap()` 函数来查询通道缓冲区中当前的消息数量和总容量,这对于监控系统负载、优化程序性能至关重要。通过具体示例,读者将掌握通道状态的获取方法,从而更好地管理并发资源。 理解 Go Chann…

    2025年12月16日
    000
  • 如何使用Golang进行WebSocket通信

    WebSocket 是一种在单个 TCP 连接上进行全双工通信的协议,适用于实时数据传输场景,比如聊天应用、实时通知等。Golang 通过第三方库 gorilla/websocket 提供了对 WebSocket 的良好支持。下面介绍如何使用 Golang 实现 WebSocket 通信。 1. 安…

    2025年12月16日
    000
  • Go项目非代码资源管理与部署策略

    本文旨在探讨go语言项目中非代码资源(如配置文件、html模板、图片等)的管理与部署策略。go的官方目录结构主要面向源代码,`go build/install`命令也仅处理代码文件,这使得非代码资源的集成成为挑战。文章将介绍自定义部署流程、相对路径处理方法以及现有框架如何解决这些问题,帮助开发者构建…

    2025年12月16日
    000
  • Go语言并发编程:解决Goroutine中循环变量捕获的常见问题

    本文深入探讨了go语言中在使用goroutine和循环时常见的变量捕获陷阱。当goroutine在循环内部创建时,如果闭包直接引用循环变量,它们会捕获变量的引用而非其当时的值,导致所有goroutine最终都使用循环结束时的变量值。文章提供了详细的问题分析、正确的解决方案(通过参数传递变量副本)及跨…

    2025年12月16日
    000
  • Go 语言接口概念理解:深入剖析 io.ReadCloser

    本文旨在深入解析 go 语言中 io.readcloser 接口的概念,并通过示例代码和详细解释,帮助读者理解接口的本质、嵌入以及如何在实际开发中正确使用 io.readcloser。本文将着重解释为什么不能直接访问 response.body.reader,并提供正确的实践方法。 在 Go 语言中…

    2025年12月16日
    000
  • GoConvey:Go语言的行为驱动开发测试框架与实时UI

    goconvey为go语言提供了rspec/jasmine风格的行为驱动开发(bdd)测试体验,通过简洁的dsl和强大的断言库,帮助开发者编写易读、易维护的测试。其独特的浏览器实时ui功能,可在代码修改后自动运行测试并即时反馈结果,显著提升开发效率和测试体验。 在Go语言的开发实践中,虽然内置的te…

    2025年12月16日
    000

发表回复

登录后才能评论
关注微信