首页 > 其他分享 >趣学前端 | 类,我想好好继承它的知识点

趣学前端 | 类,我想好好继承它的知识点

时间:2024-04-04 10:58:58浏览次数:21  
标签:知识点 console target 前端 JavaScript 趣学 new Foo 构造函数

背景

最近睡前习惯翻会书,重温了《JavaScript权威指南》。这本书,文字小,内容多。两年了,我才翻到第十章。因为书太厚,平时都充当电脑支架。

JavaScript 类

话说当年类、原型、继承,差点给我绕晕。

在JavaScript中,类使用基于原型的继承。如果两个对象从同一个原型继承属性(通常是以函数作为值的属性,或者方法),那我们说这些对象是同一个类的实例。

可能是秋季的清爽,又或者藕粉的甜蜜,这次我感觉自己开「神行千里」的buff,快速读完整章,丝滑多了。

构造函数和new.target

先来介绍一下new.target(MDN文档)。

new.target表达式可以判断函数是否作为构造函数被调用了。

  • 如果new.target的值是undefined,表示函数是作为普通函数被调用的,没有使用new关键字;
  • 如果new.target的值有定义,说明函数是作为构造函数,通过new关键字调用的。

注:使用class关键字创建的类不允许不适用new调用它们的构造函数,所以从根本上class创建的类用不到new.target。

所以我的检查功能库了又多了一条记录。

function Foo() {
  if (!new.target) throw 'Foo() must be called with new';
  console.log('Foo instantiated with new');
}

Foo(); // => throw 'Foo() must be called with new'
new Foo(); // => Foo instantiated with new

构造函数、原型、实例的关系

先来看一段代码

function Range(from, to) {
  this.from = from;
  this.to = to;
}
Range.prototype = {
  constructor: Range,
  includes: function (x) {
    return x >= this.from && x <= this.to;
  },
  toString: function () {
    return '(' + this.from + '~' + this.to + ')';
  },
};
let r1 = new Range(2, 5);
let r2 = new Range(10, 15);
console.log(r1.includes(3)); // => true
console.log(r2.toString()); // => (10~15)
console.log(r1.constructor === Range); // => true

关系图如下:

私有字段

如果想在类实例上定义字段,必须在构造函数或某个方法中定义。可定义三种类型字段,公有、私有和静态字段。

其中,定义私有字段的方式蛮有意思的。如果在字段前面加上#(通常不是合法的JavaScript标识符字符),则该字段就只能是类体中(带着#前缀)使用,对类体外部的任何代码都不可见、不可访问(因此无法被修改)。如下代码就定义了一个私有字段name,该字段通过goodName函数只允许被外部读取。

class GetGood {
  #name = '背包';
  goodName = function () {
    return this.#name;
  };
}
let g1 = new GetGood();
console.log(g1.goodName());

委托而不是继承

如果当前要写的类中,有部分行为和另一个类相似,一种方式是通过创建子类来继承行为。还有一种方式是在要写的类中创建另一个类的实例,并在需要时委托该实例去实现想要的功能,更方便也更灵活。

这种委托策略常常被称为“组合”,也是面向对象编程领域奉行的一个准则,即开发者应该“能组合就不继承”。

总结

总结一下类的知识点,ES6新增了class关键字来定义类,但是底层仍然是构造函数和原型机制在起作用。

今天也特别有收获的一天。

我发现我总是在不同的时间段反复爱上JavaScript,偶尔翻出来珍藏的技术书,都能或多或少的有点收获。

这次的宝藏图书《JavaScript权威指南》,也是一样,原来觉得枯燥的章节,最近读起来也很丝滑,比绸缎还丝滑。

关于作者

非职业「传道授业解惑」的程序媛叶一一,欢迎来稀土掘金关注我。

作者:叶一一

作者简介:「趣学前端」「CSS畅想」系列作者,华夏美食、国漫、古风重度爱好者,刑侦、无限流小说初级玩家。

文章来源:稀土掘金

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

标签:知识点,console,target,前端,JavaScript,趣学,new,Foo,构造函数
From: https://blog.csdn.net/banxianongtang/article/details/137369897

相关文章

  • 前端入门系列-HTML-HTML结构
    ......
  • jquery的blockUI遮罩层的使用(1),bootstrap前端开发
    //pluginmethodforblockingelementcontent$.fn.block=function(opts){if(this[0]===window){$.blockUI(opts);returnthis;}varfullOpts=$.extend({},$.blockUI.defaults,opts||{});this.each(function(){var$el=$(this);if(fullOpts......
  • Java后端对 前端的学习了解 ,基础知识和各框架功能发展概述,以及了解前后端的分离史
    前端的框架太多,杂乱,后端只需要掌握简单的即可 (基础的和vue框架后面详细有笔记)一.前端三要素1.HTML(结构):超文本标记语言,决定网页的结构和内容(最基础)2.CSS(表现) :层叠样式表,设定页面的修饰,相当于化妆品3.JavaScript(行为):是一种弱类型的脚本语言,源代......
  • 前端(动态雪景背景+动态蝴蝶)
     1.CSS样式<style>html,body,a,div,span,table,tr,td,strong,ul,ol,li,h1,h2,h3,p,input{font-weight:inherit;font-size:inherit;list-style:none;border-spacing:0;border:0;border-collapse:......
  • 物联网实战--入门篇之(十一)安卓QT--前端开发
    目录一、设计思路二、QML文件结构三、顶部框四、中心圆圈五、泡泡六、开关栏七、调速栏八、安卓编译一、设计思路    还是再贴一下米家APP的截图,再根据我们之前第九篇的分析,大概可以得出设计思路了。首先一个根页面当底版,然后在跟页面上进行布局,布局内容分......
  • Java最短路径算法知识点(含面试大厂题和源码)
    最短路径算法是计算机科学和图论中的核心问题之一,它旨在找到从一个顶点到另一个顶点或在所有顶点之间的最短路径。这个问题在多种实际应用中都非常重要,如网络路由、交通规划、社交网络分析等。以下是一些与最短路径算法相关的知识点:Dijkstra算法:由荷兰计算机科学家艾兹......
  • Java归并排序知识点(含面试大厂题和源码)
    归并排序是一种有效的排序算法,采用分治法(DivideandConquer)策略。它将数组分成两半,对每一半递归地进行排序,然后将两个有序的半部分合并成一个整体的有序数组。归并排序在最坏情况、平均情况和最好情况下都保持(O(n\logn))的时间复杂度,是一种稳定的排序算法。由于其分而治......
  • Java快速排序知识点(含面试大厂题含源码)
    快速排序是一种高效的排序算法,由C.A.R.Hoare在1960年提出。它的基本思想是分而治之(DivideandConquer)。快速排序的关键在于选取一个“基准值”(pivot),然后将数组分为两个子数组:一个包含所有小于基准值的元素,另一个包含所有大于基准值的元素。这个过程称为“分区”(partitio......
  • 前端学习思维导图总结~~~CSS篇
    一、前端学习总结CSS部分:二、随记分享这是前端学习过程中总结的思维导图,总结并分享出来,希望给有需要的朋友呀一些帮助,给各位看官一些参考总结的思维导图文件在 主页资源(免费):前端三件套之一:css学习总结思维导图资源-CSDN文库https://download.csdn.net/download/m0_615......
  • 操作系统知识点
    进程&线程进程不是程序。进程是动态的,有生命周期的。程序是指令的集合,是静态的。程序和进程的关系类似于类与对象的关系。线程是特殊的进程。PCB是常驻内存中的。Linux系统中fork()后父进程和子进程谁先执行?与具体操作系统有关,Ubuntu是先把父进程执行完。操作系统中共有n......