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

【JS重点15】原型对象概述

目录

一:构造函数缺陷

二:原型

1 原型是是什么

2 原型对象的作用

3 原型对象this指向问题

4 利用原型对象添加方法

给JS内置构造函数Array添加最大值方法

给JS内置构造函数Array添加求和方法

三:Constructor属性

四:如何赚钱

一:构造函数缺陷

通过使用JS来实现面向对象编程,可以通过构造函数实现封装。但一个很严重问题便是JS构造函数存在浪费内存的问题

例如:

function Fn(name, age, song) {this.name = namethis.age = agethis.song = function () {console.log('如果这都不算爱');}}const zxy = new Fn('张学友', 50)const gfc = new Fn('郭富城', 49)console.log(zxy, gfc);

以上代码中,通过构造函数的方式创建了zxy、以及gfc两个实例对象,但是执行构造函数中函数体中代码时,会声明两个功能完全相同的song()方法代码。这样便会造成内存的浪费,因为可以通过原型的方式实现所有对象使用同一个函数,可以达到节省内存目的。

二:原型

能够利用原型对象实现实例对象中方法共享

1 原型是是什么

原型是一个构造函数上的属性(prototype),同时该属性又是一个对象,我们称为原型对象

    function Star(name) {this.name = name}const zxy = new Star('张学友')console.log(Star.prototype);//Object

2 原型对象的作用

共享方法。因为原型对象可以挂在函数,可以把那些实例化对象身上通用的方法,直接定义在prototype对象上,这样所有对象的实例就可以共享这些方法。

同时,对象实例化过程中不会多次创建原型上函数,可以节约内存。

3 原型对象this指向问题

<script>let thatfunction Star(name) {this.name = name}const zxy = new Star('张学友')Star.prototype.sing = function () {that = this}zxy.sing()console.log(that === zxy);//true</script>

通过以上案例,原型对象中this指向实例化对象

4 利用原型对象添加方法

给JS内置构造函数Array添加最大值方法

<script>//给Array构造函数添加最大值Array.prototype.max = function () {return Math.max(...this)
//this指向实例化对象arr
//...this为展开运算符,用于将arr展开成1,2,3}const arr = [1, 2, 3]console.log(arr.max());//3</script>

给JS内置构造函数Array添加求和方法

Array.prototype.sum = function () {
//方法1      let sum = 0for (let index = 0; index < this.length; index++) {sum += arr[index]}return sum
//方法2return this.reduce((prev,item)=>prev+item,0)}console.log(arr.sum());//6

三:Constructor属性

每一个原型对象都有一个constructor属性,该constructor属性用于指该原型对象的构造函数

    function Star() {}Star.prototype = {sing: function () {console.log('sing');},song: function () {console.log('song');}}console.log(Star.prototype);

之前是通过在prototype原型对象身上追加属性方式,使构造函数获得方法;但是通过赋值方式,向原型对象中添加方法的话,原来的原型对象中的constructor属性就没有了。

Star.prototype = {constructor:'Star'sing: function () {console.log('sing');},song: function () {console.log('song');}}

因此要通过constructor属性使原型对象重新指向构造函数


四:如何赚钱

现在是否厌倦了程序员朝九晚五的生活、在校大学生是否愿意在校进行人生中的第一次创业、是否正在看此篇文章的你愿意通过五年努力让自己开上梦想的车子。

那就从提升底层认知开始,加入微木的知识星球:微木的创业思考

专属于创业者的交流集中地,创业、认知提升找微木!

1 创业底层方法论

2 从千万本书书籍中挑选出的,人生必读书目清单。

3 认知提升学习资源(秘密)

4 寻找赚钱项目底层方法论

5 好书精华提炼

6 深度链接微木

每天0.3元/天,欢迎加入专属于创业者的交流集中地

相关文章:

  • C语言| 数组元素的删除
  • 四川汇聚荣科技有限公司靠谱吗?
  • 基于51单片机数字频率计的设计资料
  • Stable Diffusion初体验——基于机器学习通过神经网络的强大AI平台
  • 自制HTML5游戏《贪吃蛇》
  • 【无需任何插件】将VOS录音文件REC转MP3,REC转WAV或MP3的具体流程
  • win10 安装openssl并使用openssl创建自签名证书
  • python flask配置邮箱发送功能,使用flask_mail模块
  • shell的正则表达式
  • java实现持续集成
  • 使用 C++11 Lambda 表达式在 Qt 中连接信号与槽
  • MySQL中的系统变量权限
  • 字节跳动:从梦想之芽到参天大树
  • 二叉树经典OJ练习
  • Webfunny【用户细查】七项功能升级更新:大幅提升用户排查效率!
  • 自己简单写的 事件订阅机制
  • 【跃迁之路】【733天】程序员高效学习方法论探索系列(实验阶段490-2019.2.23)...
  • Java 内存分配及垃圾回收机制初探
  • JS函数式编程 数组部分风格 ES6版
  • js中的正则表达式入门
  • leetcode讲解--894. All Possible Full Binary Trees
  • Linux学习笔记6-使用fdisk进行磁盘管理
  • Python连接Oracle
  • Storybook 5.0正式发布:有史以来变化最大的版本\n
  • Vue.js-Day01
  • 笨办法学C 练习34:动态数组
  • 基于 Ueditor 的现代化编辑器 Neditor 1.5.4 发布
  • 聊聊directory traversal attack
  • 温故知新之javascript面向对象
  • 一些css基础学习笔记
  • 远离DoS攻击 Windows Server 2016发布DNS政策
  • 交换综合实验一
  • 进程与线程(三)——进程/线程间通信
  • 如何用纯 CSS 创作一个货车 loader
  • ​渐进式Web应用PWA的未来
  • ## 临床数据 两两比较 加显著性boxplot加显著性
  • #QT(QCharts绘制曲线)
  • (3)医疗图像处理:MRI磁共振成像-快速采集--(杨正汉)
  • (C)一些题4
  • (附源码)ssm基于微信小程序的疫苗管理系统 毕业设计 092354
  • (附源码)计算机毕业设计SSM在线影视购票系统
  • (函数)颠倒字符串顺序(C语言)
  • (回溯) LeetCode 131. 分割回文串
  • (十)Flink Table API 和 SQL 基本概念
  • (未解决)macOS matplotlib 中文是方框
  • (学习总结16)C++模版2
  • (译) 函数式 JS #1:简介
  • (转)四层和七层负载均衡的区别
  • .NET Core跨平台微服务学习资源
  • .net oracle 连接超时_Mysql连接数据库异常汇总【必收藏】
  • .NET 实现 NTFS 文件系统的硬链接 mklink /J(Junction)
  • .NET 指南:抽象化实现的基类
  • .Net 中的反射(动态创建类型实例) - Part.4(转自http://www.tracefact.net/CLR-and-Framework/Reflection-Part4.aspx)...
  • .NetCore+vue3上传图片 Multipart body length limit 16384 exceeded.
  • .NET编程——利用C#调用海康机器人工业相机SDK实现回调取图与软触发取图【含免费源码】