JavaScript Prototype

news2025/12/16 11:51:25

JavaScript Prototype

JavaScript 是一种高级的、解释执行的编程语言,广泛应用于网页和服务器端开发。JavaScript 的核心特性之一是其原型继承机制,这是理解 JavaScript 对象模型的关键。

什么是 Prototype?

在 JavaScript 中,每个函数都有一个特殊的属性叫做 prototype,这个属性是一个对象,它包含了可以被特定函数的所有实例继承的属性和方法。当创建一个函数时,JavaScript 会自动为这个函数分配一个 prototype 对象。

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

Person.prototype.greet = function() {
  console.log('Hello, my name is ' + this.name);
};

var alice = new Person('Alice');
alice.greet(); // 输出: Hello, my name is Alice

在上面的例子中,Person 函数有一个 prototype 对象,我们在其中定义了一个 greet 方法。当我们创建一个 Person 的新实例 alice 时,alice 能够访问 greet 方法,即使这个方法是在 Personprototype 上定义的。

原型链

JavaScript 中的对象有一个内部属性叫做 [[Prototype]],这个属性指向对象的原型。当访问一个对象的属性或方法时,如果这个对象本身没有这个属性或方法,JavaScript 会沿着原型链向上查找,直到找到为止。

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

Person.prototype.greet = function() {
  console.log('Hello, my name is ' + this.name);
};

var alice = new Person('Alice');
alice.greet(); // 输出: Hello, my name is Alice

console.log(alice.hasOwnProperty('greet')); // 输出: false
console.log(Person.prototype.hasOwnProperty('greet')); // 输出: true

在这个例子中,alice 对象本身没有 greet 方法,但是因为它继承了 Person.prototype,所以能够调用 greet 方法。hasOwnProperty 方法用于检查一个属性是否是对象自身的属性,而不是在原型链上。

原型继承

JavaScript 中的继承是通过原型链实现的。一个对象可以继承另一个对象的属性和方法,这是通过将一个对象的原型设置为另一个对象来实现的。

function Animal() {
  this.eats = true;
}

Animal.prototype.eat = function() {
  console.log('This animal eats.');
};

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

// 继承 Animal
Dog.prototype = new Animal();

Dog.prototype.bark = function() {
  console.log('Woof! Woof!');
};

var myDog = new Dog('Buddy');
myDog.eat(); // 输出: This animal eats.
myDog.bark(); // 输出: Woof! Woof!

在这个例子中,Dog 通过将它的原型设置为一个新的 Animal 实例来继承 Animal。这样,Dog 的实例 myDog 就能够访问 Animal 的属性和方法。

原型的动态性

JavaScript 的原型是动态的,这意味着我们可以随时添加或修改原型上的属性和方法,这些更改会立即反映在所有基于该原型的对象上。

function Person() {}

var alice = new Person();
Person.prototype.sayHello = function() {
  console.log('Hello!');
};

alice.sayHello(); // 输出: Hello!

在这个例子中,尽管 sayHello 方法是在创建 alice 对象之后添加到 Person.prototype 上的,alice 仍然能够调用这个方法。

总结

JavaScript 的原型机制是其面向对象编程的核心部分。通过理解原型和原型链,开发者可以更有效地利用 JavaScript 的继承特性,创建可重用和模块化的代码。原型链的概念对于理解如何在不使用类的情况下实现继承至关重要。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1826958.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

智能驾驶时代:车联网需要怎样的智能网络底座?

2024年,智能驾驶市场火热,无论是造车新势力还是老牌车企纷纷发力智能驾驶,他们深知,新能源汽车的下半场已到,再不发力智能驾驶,可能真的有些来不及了。车企不断加码单车智能的同时,政府也在稳步…

关于BERT和embedding

embedding到一个低维向量,但是需要回到onehot高维表示,所以大部分填词游戏最后都需要加上一个MLP接头。 word2vec如此简单的结构,学习到的是embedding 基于计数的统计方法和word2vec融合就形成了glove词嵌入模型 总结:通过各种…

FL Studio21.2.9最新中文永久激活码注册码

FL Studio21中文版本激活码注册码,这个好东西我真的要给大家种草一下!🌱 让我来给大家介绍一下这款神奇的软件吧!FL Studio21是一款非常专业的音乐制作软件,功能强大到让人惊叹!😍 它可以帮助音…

AI预测福彩3D采取888=3策略+和值012路或胆码测试6月15日新模型预测第5弹

今天咱们继续验证新模型的8码定位3,目前新模型新算法8码定位经过4次测试,已命中3次,9码定位连续命中4次。咱们重点是预测8码定位3+和值012胆码。有些朋友看到我最近几篇文章没有给大家提供缩水后的预测详情,在这里解释…

使用docker构建自己的镜像并推送到远程镜像仓库

这里镜像仓库使用阿里云仓库,其他仓库可能类似,可以参考,个人实例可以免费使用。 背景 遇到的问题:需要定制一个自己的镜像,在上面安装一些环境,然后将镜像托管到公共镜像仓库,在其他地方使用…

什么是快乐?

什么是快乐? What is Happiness? 1. 快乐不是追求外在的物质,而是内心的平静与满足。当我们学会感恩,懂得珍惜眼前的一切,心中自然会充满喜悦。快乐并非来自拥有更多,而是感受到已经拥有的足够。每一天都怀抱感激之情…

04.VisionMaster 机器视觉找圆工具

VisionMaster 机器视觉找圆工具 定义 先检测出多个边缘点然后拟合成圆形,可用于圆的定位与测量 注意:找圆工具 最好和【位置修正】模块一起使用。具体可以看下面的示例。 参数说明: 扇环半径:圆环ROI的内外圆半径 边缘类型&a…

手把手教学部署前端项目到nginx

1.下载nginx 说明:下载11.20.2版本的nginx。 2.配置nginx 说明:找到conf目录下的nginx.conf文件。 2.1代理静态资源 说明:服务器块监听的端口为8089,意味着Nginx将在8089端口上接收和处理HTTP请求。root后面的值相当于html文…

socket收发数据的处理

1. TCP 协议是一种基于数据流的协议 Socket的Receive方法只是把接收缓冲区的数据提取出来,当系统的接收缓冲区为空,Receive方法会被阻塞,直到里面有数据。 Socket的Send方法只是把数据写入到发送缓冲区里,具体的发送过程由操作系统负责。当操作系统的发送缓冲区满了,Send方法会…

Android中的消息异步处理机制及实现方案

基本介绍 当我们需要执行复杂的计算逻辑,网络请求等耗时操作时,服务器可能不会立即响应请求,如果不将这类操作放在子线程中运行,就会导致主线程被阻塞住,从而影响用户的使用体验如果想要更新应用程序中的UI控件&#…

idea远程调试docker容器内正在运行的线上项目

1.重新编写Dockerfile文件 在原本的Dockerfile上新增参数 就是 运行jar包增加调试参数 增加调试暴漏的端口号 -agentlib:jdwptransportdt_socket,servery,suspendn,address*:50052.在运行docker容器的时候增加暴漏端口5005 3.打开idea就是正在运行的项目 4.选择远程配置 5.配…

解决MyBatis获取刚插入数据的ID值

解决MyBatis获取刚插入数据的ID值 Mybatis获取刚插入数据的ID值有很多解决方法,目前采用以下方式进行获取。 添加完数据后直接返回刚添加数据的id // UserDao.java public static void addUser() throws Exception{InputStream resourceAsStream Resources.getR…

idea的java代码引用proto文件报错

尝试了四种办法,感觉第一个和第二个比较有效。 前提是要先安装了 proto 的idea插件。 1.修改idea配置文件编译大文件的限制 proto生成的源文件有数万行,源文件过大导致 idea 拒绝编译过大的源文件。 解决方案: 如果 protoc 生成的 class 文…

程序优化 --- arthas trace命令使用

最近在做优化,通过arthas的trace命令去观察方法内的耗时情况以便对程序进行修改. 1.启动arthas之后选择需要监测的程序 2.找到需要监测的接口,一般都是直接找service例子如下: trace 类地址.类名 方法名 (中间有空格)

智能计算系统-概述

1、人工智能技术分层 2、人工智能方向人才培养 3、课程体系的建议 4、智能系统课程对学生的价值 5、智能计算系统对老师的价值 6、什么是智能计算系统 7、智能计算系统的形态 8、智能计算系统具有重大价值 9、智能计算系统的三大困难 10、开创深度学习处理器方向 11、寒武纪的国…

MOS开关电路应用于降低静态功耗

本文主要讲述MOS开关电路的应用,过了好久突然想整理一下,有错误的地方请多多指出,在做电池类产品,需要控制产品的静态功耗,即使让芯片进入休眠状态,依旧功率很大,所以在电路中加一组软开关,防止…

嵌入式软件工程师入何突破瓶颈?

各位关注嵌入式软件工程师发展的朋友们,下面来探讨一下嵌入式软件工程师该如何突破瓶颈。首先要强调的是,不要仅仅将自己局限在嵌入式软件工程师这一角色定位上。 事实上,嵌入式软件工程师已经掌握了诸多业务层面的内容,完全有能力…

【C++】编译原理

三、C编译 前面给大家演示了如何从写C代码到编译代码再到执行代码的全过程。这个过程中非常重要的编译环节,被我们一个按钮或者一个ctrlF7快捷键就给带过了。其实这个环节非常重要,如果你非常了解这个环节,你开发源代码就会更加自信和清醒&a…

pytest + yaml 框架 -61.jenkins+allure+钉钉通知添加测试结果

前言 上一篇pytest + yaml 框架 -60.git+jenkins+allure+钉钉通知反馈 已经实现测试结果用钉钉通知。 本篇继续在钉钉通知里添加测试的汇总结果,此功能在pytest-yaml-yoyo v1.5.2版本上实现。 Environment Injector 插件 在运行完用例后会生成一个summary.json 文件,汇总…

【系统架构】REST风格

系列文章目录 第一章 系统架构的演进 第二章 REST风格架构 文章目录 系列文章目录前言一、进程间的通信普通管道(Pipe)或者具名管道(Named Pipe)信号(Signal)信号量(Semaphore)消息…