当前位置: 首页 > news >正文

对于原型链的理解

1.同一个构造函数的多个实例之间 无法共享属性(创建多个实例的时候会造成资源浪费)
function Cat(name, color) {this.name = name;this.color = color;this.meow = function () {console.log('miao');};
}var cat1 = new Cat('LH', 'White');
var cat2 = new Cat('EH', 'Black');cat1.meow === cat2.meow
// false

上面代码中,cat1和cat2是同一个构造函数的两个实例都具有meow方法
由于meow方法是生成在每个实例对象上面,所以两个实例就生成了两次
也即每新建一个实例就会新建一个meow方法
这既没有必要,又浪费系统资源,因为所有meow方法都是同样的行为,完全应该共享
这种缺点的解决方法即是JS的原型对象(prototype)

2.prototype

JS继承机制的设计思想是原型对象的所有属性和方法,都能被实例对象共享
上述缺点的解决方法理由: 也即若属性和方法定义在原型上则所有的实例对象都可以共享,从而节省内存并且体现出实例对象之间的联系

下面是为对象指定原型
JS规定每个函数都有一个prototype属性用于指向一个对象

function f() {}
typeof f.prototype // "object"

上面代码中,函数f默认具有prototype属性,指向一个对象
对于普通函数来说,该属性基本无用
但是对于构造函数来说,生成实例的时候,该属性会自动成为实例对象的原型

function Animal(name) {this.name = name;
}
Animal.prototype.color = 'white';var cat1 = new Animal('LH');
var cat2 = new Animal('EH');cat1.color // 'white'
cat2.color // 'white'

上面代码中构造函数Animal的prototype属性,就是实例对象cat1和cat2的原型对象
原型对象上添加一个color属性则实例对象都共享该属性

原型对象的属性不是实例对象自身的属性
只要修改原型对象,变动就立刻会体现在所有实例对象上,当实例对象本身没有某个属性或方法的时候,它会到原型对象去寻找该属性或方法(否则直接使用本身的属性和方法)
如:

cat1.color = 'black';
Animal.prototype.color = 'yellow';cat1.color // "black"
cat2.color // "yellow"

总结一下原型对象的作用,定义所有实例对象共享的属性和方法

3.prototype的constructor属性

prototype对象有constructor属性默认指向prototype对象所在的构造函数,由于constructor属性定义在prototype对象上面,意味着可以被所有实例对象继承

function P() {}
var p1 = new P();p1.constructor === P // true  constructor属性的作用:可以得知某个实例对象,到底是哪一个构造函数产生的
p1.constructor === P.prototype.constructor // true
p1.hasOwnProperty('constructor') // false   继承的所以是false,本身没有这个属性

由于constructor属性我们可以从一个实例对象新建另一个实例

function Constr() {}
var x = new Constr();var y = new x.constructor();
y instanceof Constr // true

constructor属性表示原型对象与构造函数之间的关联关系
如果修改了原型对象,一般会同时修改constructor属性,防止引用的时候出错

function Person(name) {this.name = name;
}Person.prototype.constructor === Person // truePerson.prototype = {method: function () {}
};Person.prototype.constructor === Person // false
Person.prototype.constructor === Object // true

如果不能确定constructor属性是什么函数,还有一个办法:通过name属性,从实例得到构造函数的名称

funciton Foo() {};
var f = new Foo();
f.constructor.name // "Foo"

4.__proto__属性

简单记就是:构造函数的原型对象prototype会等于实例对象的__proto__属性

var A = function (){}
var a = new A()
console.log(a.__proto__ === A.prototype) // true

5.模块化思想-封装私有变量(不暴露私有变量)

使用IIFE(Immediately-Invoked Function Expression)
将相关属性和方法封装在一个函数作用域中从而不暴露私有成员

var module1 = (function ($) {var _count = 0;var m1 = function () {// some code};var m2 = function () {// some code};return {m1: m1,m2: m2};
})(jQuery);

使用上面的方法外部代码无法读取内部的_count变量,上面的module1就是 JavaScript 模块化的基本写法

相关文章:

对于原型链的理解

1.同一个构造函数的多个实例之间 无法共享属性(创建多个实例的时候会造成资源浪费) function Cat(name, color) {this.name name;this.color color;this.meow function () {console.log(miao);}; }var cat1 new Cat(LH, White); var cat2 new Cat(…...

Web开发:Vue中的事件小结

一、全选按钮checkbox <template><div id"checkboxs"><label><input id"selectAll" type"checkbox" v-model"selectAllChecked" change"selectAllItems">全部</label><label v-for"…...

基于Springboot的运行时动态可调的定时任务

配置类 import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;Configuration public class TaskSchedulerConfig {Bean(destroyMe…...

linux perf

perf是Linux性能分析工具的集合&#xff0c;它提供了丰富的命令来收集和分析程序运行时的性能数据。perf能够报告CPU使用率、缓存命中率、分支预测成功率等多种硬件级别的事件&#xff0c;同时也支持软件级别的事件&#xff0c;如页面错误、任务切换等。perf是理解程序性能瓶颈…...

Linux--网络层IP

IP协议 IP协议&#xff0c;全称Internet Protocol&#xff08;互联网协议&#xff09;&#xff0c;是TCP/IP协议族中的核心协议之一&#xff0c;用于在互联网络上进行数据的传输。IP协议的主要功能是确保数据从一个网络节点&#xff08;如计算机、服务器、路由器等&#xff09…...

浅谈vite之import.meta

一. 解析 开发者使用一个模块时&#xff0c;有时需要知道模板本身的一些信息&#xff08;比如模块的路径&#xff09;。现在有一个提案&#xff0c;为 import 命令添加了一个元属性 import.meta&#xff0c;返回当前模块的元信息。 import.meta只能在模块内部使用&#xff0c;如…...

【Pytorch实用教程】Pytorch中nn.Sequential的用法

nn.Sequential 是 PyTorch 中用于构建神经网络的一种容器类,它可以按顺序封装多个子模块(层),并依次将输入数据传递给这些子模块。这样可以简化模型的定义,使得代码更加简洁和易读。 文章目录 基本用法方法一:直接传递子模块方法二:使用 `OrderedDict`动态构建模型优点注…...

Shopify被封?Shopify店铺开店到防封全面指南

Shopify&#xff0c;作为独立电商建站领域的佼佼者&#xff0c;其SaaS模式简化了建站流程&#xff0c;无需编程背景即可创建线上店铺&#xff0c;吸引了众多商家的目光。本文将详细讲解Shopify店铺从注册、运营到防封的每一个关键环节&#xff0c;为商家提供一站式指导&#xf…...

11. 盛最多水的容器

一题目&#xff1a; 二&#xff1a;代码&#xff1a; class Solution { public:int maxArea(vector<int>& height) {int l0;int rheight.size()-1;int ans0;while(l<r){int a(r-l)*min(height[l],height[r]);ansmax(ans,a);if(height[l]<height[r]) l;else r-…...

react如何父子组件传参

在React中&#xff0c;父子组件之间的传参主要通过props&#xff08;属性&#xff09;来实现。子组件通过props接收来自父组件的数据&#xff0c;而父组件则可以通过在子组件标签上设置属性&#xff08;即props&#xff09;来传递数据。下面是一个简单的例子来说明这个过程。 …...

【C++】二维数组 数组名

二维数组名用途 1、查看所占内存空间 2、查看二维数组首地址 针对第一种用途&#xff0c;还可以计算数组有多少行、多少列、多少元素 针对第二种用途&#xff0c;数组元素、行数、列数都是连续的&#xff0c;且相差地址是有规律的 下面是一个实例 #include<iostream&g…...

【蘑菇书EasyRL】强化学习,笔记整理

【蘑菇书EasyRL】强化学习&#xff0c;笔记整理 1.笔记整理1.1 学习和决策代码框架 2. 遇到的buggym 环境&#xff0c;新版本python无法使用env_specs envs.registry.all() 报错 蘑菇书的教程地址&#xff1a; https://datawhalechina.github.io/easy-rl/#/chapter1/chapter1?…...

尚硅谷谷粒商城项目笔记——三、安装docker【电脑CPU:AMD】

三、安装docker 注意&#xff1a; 因为电脑是AMD芯片&#xff0c;自己知识储备不够&#xff0c;无法保证和课程中用到的环境一样&#xff0c;所以环境都是自己根据适应硬件软件环境重新配置的&#xff0c;这里的虚拟机使用的是VMware。 首先关闭防火墙和安全策略 systemctl…...

【8-9月份唯一机械电气计算机主题的IEEE会议】第七届机电一体化与计算机技术工程国际学术会议(MCTE 2024,8月23-25)

由广东博士创新发展促进会、输变电装备技术全国重点实验室联合主办&#xff0c;重庆大学电气工程学院、AEIC学术交流中心协办的第七届机电一体化与计算机技术工程国际学术会议&#xff08;MCTE 2024&#xff09;将于2024年8月23-25日在中国广州隆重举行。 大会诚挚邀请您投递相…...

YOLOv8改进 | 主干网络 | 简单而优雅且有效的VanillaNet 【华为诺亚方舟】

秋招面试专栏推荐 :深度学习算法工程师面试问题总结【百面算法工程师】——点击即可跳转 💡💡💡本专栏所有程序均经过测试,可成功执行💡💡💡 专栏目录 :《YOLOv8改进有效涨点》专栏介绍 & 专栏目录 | 目前已有80+篇内容,内含各种Head检测头、损失函数Loss、…...

Tomcat高可用集群(实例详解)

一.环境准备 虚拟机的版本&#xff1a;VMware-workstation-full-15.5.6-16341506.exe系统镜像版本&#xff1a;CentOS-6.10-x86_64-bin-DVD1.iso&#xff0c;全新安装&#xff0c;桌面版&#xff0c;可上网系统内存大小&#xff1a;1GB系统硬盘大小&#xff1a;20GB连接工具版…...

搭建自己的金融数据源和量化分析平台(五):更新两市退市股票信息

在前面的股票列表设计中&#xff0c;我们有一个list_status字段&#xff0c;可能的值为L上市 D退市 P暂停上市。 由于股票可能会被退市&#xff0c;因此需要该字段来维护上市状态。 深市爬虫&#xff1a; # 读取深交所最新退市股票列表 def get_delisted_stock_list():cache_f…...

Redis复习总结

之前写的博客太杂,最近想把Redis的知识点再系统的过一遍,带着自己的理解使用简短的话把一些问题总结一下,尤其是开发中和面试中的高频问题,基础知识点参考–>Redis入门、Spring Cache,这篇不再赘述。 目录 基础简介;与Memcached的区别;为什么作为mysql缓存?如何保证R…...

基于JSP的医院挂号系统

你好&#xff0c;我是专注于医疗信息系统的计算机专业毕业生。如果您对医院挂号系统感兴趣或有相关需求&#xff0c;欢迎随时联系我。 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;JSP技术 工具&#xff1a;MyEclipse 系统展示 首页 管理员功能模…...

Chainlit快速实现AI对话应用1 分钟内实现聊天数据的持久化保存

概述 默认情况下&#xff0c;Chainlit 应用不会保留其生成的聊天和元素。即网页一刷新&#xff0c;所有的聊天记录&#xff0c;页面上的所有聊天记录都会消失。但是&#xff0c;存储和利用这些数据的能力可能是您的项目或组织的重要组成部分。 一旦启用&#xff0c;数据持久性…...

2026届学术党必备的AI写作工具推荐

Ai论文网站排名&#xff08;开题报告、文献综述、降aigc率、降重综合对比&#xff09; TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 大语言模型DeepSeek&#xff0c;于论文写作中能予以多维度辅助。在文献检索阶段&#xff0c;…...

RAG核心技术实战指南:从切片策略到召回优化的全流程解析

1. RAG技术全景解析&#xff1a;从原理到价值 第一次接触RAG技术时&#xff0c;我被它巧妙的设计思路惊艳到了。想象一下&#xff0c;你正在参加一场开卷考试&#xff0c;允许带一本参考书进场——这就是RAG给大语言模型带来的改变。传统的大模型就像闭卷考试的学生&#xff0c…...

读了libstdc++的regex源码,找到了C++标准库慢100倍的5个根因

很多写C++的人心里有个默认假设:标准库的东西,性能就算不是最优,至少不会太差。毕竟C++的卖点就是性能,标准委员会和标准库维护者不可能在这件事上翻车。 这个假设在大多数组件上成立。std::sort比手写快排更稳健,std::unordered_map大多数场景够用,std::vector的内存布…...

FireRedASR Pro实战案例:如何将1小时会议录音快速整理成文字稿

FireRedASR Pro实战案例&#xff1a;如何将1小时会议录音快速整理成文字稿 1. 场景痛点与解决方案 1.1 会议记录的传统困境 想象一下这样的场景&#xff1a;公司每周的部门例会刚刚结束&#xff0c;作为会议记录负责人的你&#xff0c;面对长达1小时的录音文件发愁。传统的人…...

ANIMATEDIFF PRO企业级部署:API服务化与WebUI双模式运行指南

ANIMATEDIFF PRO企业级部署&#xff1a;API服务化与WebUI双模式运行指南 1. 项目概述与核心价值 ANIMATEDIFF PRO是一个基于先进AnimateDiff架构的专业级文生视频渲染平台&#xff0c;专为追求电影级视觉效果的内容创作者和AI艺术家设计。这个平台集成了Realistic Vision V5.…...

别再只用‘auto’模式了!深入Halcon条码识别参数:手把手教你调优barcode_width_min与扫描线提升识别率

突破Halcon条码识别瓶颈&#xff1a;从参数调优到工业级精准解码实战 在工业自动化与物流分拣系统中&#xff0c;条码识别作为数据采集的核心环节&#xff0c;其准确率直接关系到整个生产线的运行效率。许多工程师在使用Halcon进行条码识别时&#xff0c;往往止步于默认的"…...

大模型之Linux服务器部署大模型菊

一、各自优势和对比 这是检索出来的数据&#xff0c;据说是根据第三方评测与企业数据&#xff0c;三款产品在代码生成质量上各有侧重&#xff1a; 产品 语言优势 场景亮点 核心差异 百度 Comate C核心代码质量第一&#xff1b;Python首生成率达92.3% SQL生成准确率提升35%&…...

RAGflow 0.22.2 依赖镜像构建避坑指南:解决libssl缺失与HuggingFace下载难题

RAGflow 0.22.2 依赖镜像构建实战&#xff1a;从libssl缺失到HuggingFace模型下载的完整解决方案 在构建RAGflow 0.22.2自定义镜像的过程中&#xff0c;依赖镜像ragflow_deps的构建往往是第一个拦路虎。许多开发者在这里遭遇了各种意料之外的问题&#xff0c;从Ubuntu源中消失的…...

Universal ADB Driver:Windows平台终极Android设备驱动解决方案

Universal ADB Driver&#xff1a;Windows平台终极Android设备驱动解决方案 【免费下载链接】UniversalAdbDriver One size fits all Windows Drivers for Android Debug Bridge. 项目地址: https://gitcode.com/gh_mirrors/un/UniversalAdbDriver 还在为Android设备连接…...

仅限首批200名数据工程师获取:Polars 2.0清洗故障响应手册(含17个panic!错误码速查表+core dump符号解析指南)

第一章&#xff1a;Polars 2.0大规模数据清洗避坑总则Polars 2.0 在性能与 API 稳定性上实现重大跃升&#xff0c;但其惰性执行模型、列式语义约束及严格类型推断机制&#xff0c;也使常见 Pandas 风格的清洗逻辑极易引发静默失败或内存暴增。务必遵循以下核心原则以规避典型陷…...