重学前端学习笔记(八)--JavaScript中的原型和类

笔记说明

重学前端是程劭非(winter)【前手机淘宝前端负责人】在极客时间开的一个专栏,每天10分钟,重构你的前端知识体系,笔者主要整理学习过程的一些要点笔记以及感悟,完整的可以加入winter的专栏学习【原文有winter的语音】,如有侵权请联系我,邮箱:kaimo313@foxmail.com。

一、什么是原型?

1.0、定义

原型是指一个词语或一个类型意义的所有典型模型或原形象,是一个类型的组典型特征

1.1、基于类的编程语言

诸如 C++、Java 等流行的编程语言是使用类的方式来描述对象,基于类的编程提倡使用一个关注分类和类之间关系开发模型。

1.2、基于原型的编程语言

如 JavaScript 编程语言是利用原型来描述对象,基于原型的编程看起来更为提倡程序员去关注一系列对象实例的行为,而后才去关心如何将这些对象,划分到最近的使用方式相似的原型对象,而不是将它们分成类。

1.3、原型系统的“复制操作”有两种实现思路

  • 一个是并不真的去复制一个原型对象,而是使得新对象持有一个原型的引用
  • 另一个是切实地复制对象,从此两个对象再无关联。

javaScript选择了第一种方式。

二、JavaScript 的原型

2.0、原型系统的两条概括

  • 如果所有对象都有私有字段 [[prototype]],就是对象的原型
  • 读一个属性,如果对象本身没有,则会继续访问对象的原型,直到原型为空或者找到为止。

2.1、三个内置函数

可以利用下面三个方法,更直接地访问操纵原型,来实现抽象和复用。

  • Object.create 根据指定的原型创建新对象,原型可以是 null
  • Object.getPrototypeOf 获得一个对象的原型
  • Object.setPrototypeOf 设置一个对象的原型

winter举了用原型来抽象猫和虎的例子:

var cat = {say() {console.log("meow~");},jump() {console.log("jump");}
}var tiger = Object.create(cat,  {say: {writable: true,configurable: true,enumerable: true,value: function(){console.log("roar!");}}
})var anotherCat = Object.create(cat);anotherCat.say(); // meow~var anotherTiger = Object.create(tiger);anotherTiger.say(); // roar!复制代码

三、早期版本中的类与原型

3.0、“类”的定义是一个私有属性 [[class]]

所有具有内置 class 属性的对象:(ES3和之前版本)

var o = new Object;
var n = new Number;
var s = new String;
var b = new Boolean;
var d = new Date;
var arg = function(){ return arguments }();
var r = new RegExp;
var f = new Function;
var arr = new Array;
var e = new Error;
console.log([o, n, s, b, d, arg, r, f, arr, e].map(v =>   Object.prototype.toString.call(v))
)复制代码

语言使用者唯一可以访问 [[class]] 属性的方式是 Object.prototype.toString

3.1、[[class]] 私有属性被 Symbol.toStringTag 代替

可以查看MDN文档Symbol.toStringTag以及Object.prototype.toString的介绍:(ES5开始)

var o = { [Symbol.toStringTag]: "MyObject" }
console.log(o + ""); // [object MyObject]
复制代码

上面这段代码创建了一个新对象,并且给它唯一的一个属性 Symbol.toStringTag,用字符串加法触发了Object.prototype.toString 的调用,发现这个属性最终对 Object.prototype.toString 的结果产生了影响。

3.2、new运算做了什么?

  • 1、以构造器的 prototype 属性(注意与私有字段 [[prototype]] 的区分)为原型,创建新对象
  • 2、将 this 和调用参数传给构造器,执行
  • 3、如果构造器返回的是对象,则返回,否则返回第一步创建的对象。

用构造器模拟类的两种方法:

// 1、在构造器中修改 this,给 this 添加属性function c1() {this.p1 = 1;this.p2 = function(){console.log(this.p1);}
}
var o1 = new c1;
o1.p2(); // 1// 2、修改构造器的 prototype 属性指向的对象,它是从这个构造器构造出来的所有对象的原型。function c2() {
}
c2.prototype.p1 = 1;
c2.prototype.p2 = function() {console.log(this.p1);
}var o2 = new c2;
o2.p2(); // 1复制代码

四、ES6 中的类

4.0、类的基本写法

class Rectangle {constructor(height, width) {this.height = height;this.width = width;}// Getterget area() {return this.calcArea();}// MethodcalcArea() {return this.height * this.width;}
}复制代码

4.1、类的继承能力

class Animal {constructor(name) {this.name = name;}speak() {console.log(this.name + ' makes a noise.');}
}class Dog extends Animal {constructor(name) {super(name); // call the super class constructor and pass in the name parameter}speak() {console.log(this.name + ' barks.');}
}let d = new Dog('Mitzie');
d.speak(); // Mitzie barks.复制代码

上面代码调用子类的 speak 方法获取了父类的 name。如果对于class还想了解更多,可以查看MDN文档Classes部分。

个人总结

其实对于这一部分很是不明白,也不清楚,对于这些js基础性的东西还是要多下下功夫才行,毕竟winter的重学前端真心不错,对我来说进行查漏补缺,看清自己的水平很有帮助,路还很长,还要加油呀!!!

转载于:https://juejin.im/post/5cd02d63f265da03b36efc18

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

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

相关文章

代码实现照片素描_我的代码素描之旅

代码实现照片素描In 2018 I started the process of consistently creating and posting my code sketches online. These are small animations I make with code and post on instagram. Through these sketches I tried to visually express my ideas using color, animatio…

GCC参数详解

转自:http://www.cnblogs.com/fence/archive/2009/12/18/1627138.html GCC参数详解 gcc and g分别是gnu的c & c编译器 gcc/g在执行编译工作的时候,总共需要4步1.预处理,生成.i的文件[预处理器cpp]2.将预处理后的文件不转换成汇编语言,生成文件.s[编…

真效率神器,UI稿智能转换成前端代码,准确率极高

大家好,我是若川。在这充满网络促销活动的几个月,倍感压力的,除了你的口袋,是否还有程序员的发量呢?每年的双十一、双十二购物狂欢节,各大电商平台都会上线让消费者充满购买欲望的活动页面,而这…

PPT图标的正确使用和插入与编辑形状

PPT图标的正确使用和插入与编辑形状 通过图标可以以符号的形式直观地传递信息。 一,实战:在销售工作计划中插入图标 PowerPoint 2016中提供了多种类型的图标,用户可根据需要在幻灯片中插入所需的图标。 二,实战:更改销…

几个用于序列化的代码片段

参考JavaScriptSerializer,一般用来做JSON格式化http://msdn.microsoft.com/zh-cn/library/system.web.script.serialization.javascriptserializer.aspx http://msdn.microsoft.com/zh-cn/library/system.web.script.serialization.javascriptconverter.aspxDataContractSeria…

桌面图标摆放图案_用图标制作醒目的图案

桌面图标摆放图案Level up your video calls with a custom backdrop created using Noun Project icons.使用使用Noun Project图标创建的自定义背景来升级视频通话。 The only thing more visually pleasing than a well-designed icon is a neat, eye-catching pattern made…

3个多月,近3000人参与的源码共读,诚邀加入~

大家好,我是若川。众所周知,从8月份开始,我组织了源码共读活动,每周学习200行左右的源码,到现在持续了3个多月,坚持答疑解惑。帮助了不少人,还是挺开心的。另外,涌现了很多优秀的读者…

upc 组队赛18 STRENGTH【贪心模拟】

STRENGTH 题目链接 题目描述 Strength gives you the confidence within yourself to overcome any fears, challenges or doubts. Feel the fear and do it anyway! If you have been going through a rough time and feel burnt out or stressed, the Strength card encourag…

JSONNull

最近用JSONObject,感觉比xml好用一些,json的打包和解包都比较清晰和容易,最近遇到一个问题,将一个JSON对象解析,存到hashmap中去,然后再从hashmap取出数据,遇到jsonnull的问题,本以为…

“这张图告诉你什么?”

For data to be impactful, it must be understood.为了使数据具有影响力,必须理解它。 I’ve happily spent hundreds and hundreds of hours of my life watching users misunderstand data visualizations. I’m strangely hooked on it.我快乐地度过了数百个小…

我们从 UmiJS 迁移到了 Vite

大家好,我是若川。最近组织了源码共读活动,感兴趣的可以点此加我微信ruochuan12 进群参与,每周大家一起学习200行左右的源码,共同进步。已进行三个月了,很多小伙伴表示收获颇丰。我们从 UmiJS迁移到 Vite 已经上线半年…

将DataTable的内容以EXCEl的形式导出到本地

1.在搞项目的时候一般会遇到,将GridView或者Repeater的内容以Excel的形式保存到本地,即导出功能。我总结了两个方法。 方法一: 1 DataTable dt query.GetItems().GetDataTable();2 if (dt ! null)3 {4 …

智能家居数据库设计_设计更智能的数据表

智能家居数据库设计重点 (Top highlight)Data tables are hard. There are many different ways to think about them. So, naturally, the first step would be to figure out what your users need.数据表很难。 有许多不同的方式来考虑它们。 因此,自然地&#x…

可能是全网首个前端源码共读活动,诚邀你加入一起学习

大家好,我是若川。众所周知,从8月份开始,我组织了源码共读活动,每周学习200行左右的源码,到现在持续了3个多月,坚持答疑解惑。帮助了不少人,还是挺开心的。另外,涌现了很多优秀的读者…

vsftpd 的配置项目

基本配置说明: 1)local_root/ftpfile(当本地用户登入时,将被更换到定义的目录下,默认值为各用户的家目录) 2)anon_root/ftpfile(使用匿名登入时,所登入的目录) 3)use_localtimeYES(默认是GMT时…

线段树专辑——pku 3667 Hotel

http://poj.org/problem?id3667 哈哈&#xff0c;经典中的经典题啊。利用线段树求最大连续空闲区间&#xff0c;并返回空闲区间的起点坐标。 View Code 1 #include<iostream> 2 #include<string> 3 #include<algorithm> 4 using namespace std; 5 6 …

houseparty不流畅_重新设计Houseparty –用户体验案例研究

houseparty不流畅Houseparty has become very popular during the COVID-19 period because it helps you connect with others in a fun way. The concept is simple, you open the app and jump on a video call with your friends. You can even play online games with the…

你不知道的 Node.js 工具函数

从类型判断说起在 JavaScript 中&#xff0c;进行变量的类型校验是一个非常令人头疼的事&#xff0c;如果只是简单的使用 typeof 会到各种各样的问题。举几个简单的&#x1f330;&#xff1a;console.log(typeof null) // object console.log(typeof new Array) // object cons…

Java应用集群下的定时任务处理方案(mysql)

今天来说一个Java多机部署下定时任务的处理方案。 需求: 有两台服务器同时部署了同一套代码&#xff0c; 代码中写有spring自带的定时任务&#xff0c;但是每次执行定时任务时只需要一台机器去执行。 当拿到这个需求时我脑子中立马出现了两个简单的解决方案&#xff1a; 利用ip…

概念验证_设置成功的UX概念验证

概念验证用户体验/概念证明/第1部分 (USER EXPERIENCE / PROOF OF CONCEPT / PART 1) This is the first article of a four-part series. Please read Part 2 and Part 3.这是由四个部分组成的系列文章的第一篇。 请阅读 第2 部分 和 第3部分 。 How do today’s top UX desi…