首页
归档
歌单
友链
推荐
关于
状态
追番
语录
Search
1
JavaScript笔记1-ES5~6语法
607 阅读
2
HTML笔记
540 阅读
3
Profile
392 阅读
4
轻量网页聊天室系统搭建——HULILTS
391 阅读
5
HuHitokotoV2.1-一言接口文档
228 阅读
笔记
项目
杂谈
其它
登录
/
注册
Search
标签搜索
观感
galgame
ACG
web
开发
视觉小说
API
JavaScript
学习
前端
PHP
治愈
http
后端
接口
杂谈
技术
JavaScript笔记
动漫
AI
Hotaru
累计撰写
20
篇文章
累计收到
13
条评论
首页
栏目
笔记
项目
杂谈
其它
页面
归档
歌单
友链
推荐
关于
状态
追番
语录
搜索到
5
篇与
的结果
2023-07-01
JS的原型、原型链、构造函数
抛砖引玉以下是JavaScript中的一个简单的new操作// ES5中通过构造函数 function Foo() { // ... } let f1 = new Foo(); // ES6中通过class class Foo2() { constructor() { // ... } } let f2 = new Foo2();如图所示,尽管只是一个非常简单且常规的操作,但是他在JS中的执行过程是十分的复杂的,而这也就涉及这五个概念:prototype、[[Prototype]]、\_\_proto\_\_、constructor、原型链,以下将围绕这张图对其进行逐一讲解,建议先看最后面的总结,再来看以下内容,最后再理解一遍总结内容加深理解图片中函数后面加括号仅用于更清楚的表示其为一个函数,不代表函数执行后的返回值,下文也是如此prototype原型,又叫原型对象,类型是一个对象(Object),仅函数(Function)有该属性(类Class的本质也是函数)用于构造函数或类为其实例对象(通过关键字new创建)提供公共的属性和方法[[Prototype]]隐式原型,仅对象才拥有,它指向自己的prototype原型对象(或者说父对象),可以通过Object.getPrototypeOf()和Object.setPrototypeOf()方法进行访问和设置\_\_proto\_\_[[prototype]]是规范和一些书籍对隐式原型的表示方法,\_\_proto\_\_ 是浏览器厂商对隐式原型的实现,其实就是一个东西;过去浏览器显示为__proto__,现在改为另外一种显示呢,等同于[[Prototype]],是许多浏览器和JavaScritp引擎的非ECMAScript标准实现__proto是对象所独有的,通过直接访问该属性即可更改console.log(Object.getPrototypeOf(f1) === f1.__proto__) // true但是这是非ECMAScript标准,会有安全问题,因此更推荐使用Object.getPrototypeOf()和Object.setPrototypeOf()方法,这里将使用__proto__进行说明它的作用也是一致的,指向自己的构造函数的prototype原型对象(或者说父对象),因此下列输出成立console.log(f1.__proto__ === Foo.prototype) // true有了以上知识我们可以正式开始讲解该图片了,先不管别的,来看最左边的一列,我们说过,prototype它是一个对象,因此它也有__proto__属性,而它的属性指向哪了?显然,只要我们没有特意设置它的指向的话,那便是Object.prototype,再继续向下找__proto__那便是null,这一个接连一个的查找形成了一个链条,这便是大名鼎鼎的原型链,而null便是原型链的终点。这里扩展一下,我们说了,prototype是对象类型的,而终点null是一种特殊的存在,表示不可在继续查找下去。null 虽然用typeof打印出来的类型为 "object", 但它的真实类型应该是Null ,表示一个空对象指针。它不是一个对象类型,不能调用对象的方法。console.log(typeof null) // object这里我们换一个例子来进一步理解原型链let arr = new Array(); console.log(arr.__proto__ === Array.prototype); console.log(Array.prototype.__proto__ === Object.prototype);使用Array()构造函数来创造了一个数组实例arr,数组arr的隐式原型指向数组原型对象Array.prototype,因此第一个输出成立,然后Array.prototype又指向对象的prototype,再次成立,最后指向null关于函数如果只是对象的话,那么这个图便不会如此复杂,但因为函数的存在大大增加了这个图的复杂度,函数的本质也是一个对象,因此函数既有__proto__和prototype,这也是许多人迟迟搞不懂原型链的原因,不用想那么多,一个函数的__proto__与prototype是完全没有任何关系的现在先不管所有的constructor,Foo()函数的__proto__显而易见的指向了一个叫做Function.prototype的东西,没错他便是构造函数Function()的原型对象,而一切的函数都由Function()创造,如图所示,它的__proto__又指向了Object()函数的原型对象Object.prototype,再而指向null,相反的,Object()是一个构造函数,因此__proto__又指向Function.prototype关于函数还有一个需要注意的一点,那就是图中Function的prototype和__proto__是相等的。可以理解为,所有函数的__proto__都指向Function()构造函数的原型对象,而Function()本身也是函数又是对象,所以自己的__proto__属性指向自己的原型对象Function.prototypeconsole.log(Function.__proto__ === Function.prototype); // trueconstructor与__proto__类似,对象独有的属性,用于原型对象(prototype)指回其构造函数本身。如图所示,一个的函数prototype和它的constructor的关系是:函数通过prototype属性访问其原型对象,而原型对象上有一个constructor属性指回其构造函数本身而实例对象(如图中的f1)它的constructor也指向Foo(),但只是继承而来的并不真正拥有(因为f1它是Foo()的实例)需要注意一点,所有的函数的constructor最终都继承来自Function()构造函数,而Function()的constructor又继承于自身总结prototype仅函数(class类也是函数)拥有,用于给自己实例化对象提供公共公告属性或对象\_\_proto\_\_和constructor仅对象拥有,因为函数本质也是对象所以函数同时拥有以上三者。\_\_proto\_\_指向自己的原型对象(即prototype),因此f1.__proto__ === Foo.prototype查找一个实例对象的属性或方法先从自身开始查找,若没有则查找自己构造函数的prototype;若没有,继续查找函数的prototype属性里的__proto__属性的又一个原型对象,直至查找到Object.prototype,再往下的__proto__便为null,这样的链式查找方式便是原型链,null是原型链的终点constructor用于prototype里指回自己的构造函数,实例对象继承于自己的构造函数,即Foo === Foo.prototype.constuctor所有对象的prototype最终指向Object.prototype,所有对象的constuctor最终指向Function()构造函数,Function()的constructor继承于自己鸣谢本文参考了以下链接中的内容并综合自己的个人理解,如若有误欢迎指出,排名分先后https://chen-cong.blog.csdn.net/article/details/81211729https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Inheritance_and_the_prototype_chainhttps://www.bilibili.com/video/BV1PG411774phttps://www.bilibili.com/video/BV1Wa4y1N7YS
2023年07月01日
23 阅读
0 评论
1 点赞
2023-06-16
Git笔记
命令别名cd ~/ vi .bashrc添加以下内容# 友好的日志显示 alias git-log='git log --pretty=oneline --all --graph --abbrev-commit' # 友好的文件列表显示 alias ll='ls -al'创建仓库克隆一个已创建的仓库通过 SSH$ git clone ssh://user@domain.com/repo.git通过 HTTP$ git clone http://domain.com/user/repo.git创建一个新的本地仓库 $ git init添加修改添加修改到暂存区把指定文件添加到暂存区$ git add xxx把当前所有修改添加到暂存区$ git add .把所有修改添加到暂存区$ git add -A提交修改到本地仓库提交本地的所有修改$ git commit -a提交之前已标记的变化$ git commit附加消息提交$ git commit -m 'commit message'储藏有时,我们需要在同一个项目的不同分支上工作。当需要切换分支时,偏偏本地的工作还没有完成,此时,提交修改显得不严谨,但是不提交代码又无法切换分支。这时,你可以使用 git stash 将本地的修改内容作为草稿储藏起来。官方称之为储藏,但我个人更喜欢称之为存草稿。1.将修改作为当前分支的草稿保存$ git stash查看草稿列表$ git stash list stash@{0}: WIP on master: 6fae349 :memo: Writing docs.3.1 删除草稿$ git stash drop stash@{0}3.2 读取草稿$ git stash apply stash@{0}撤销修改移除缓存区的所有文件(i.e. 撤销上次git add)$ git reset HEAD将HEAD重置到上一次提交的版本,并将之后的修改标记为未添加到缓存区的修改$ git reset <commit>将HEAD重置到上一次提交的版本,并保留未提交的本地修改$ git reset --keep <commit>放弃工作目录下的所有修改$ git reset --hard HEAD将HEAD重置到指定的版本,并抛弃该版本之后的所有修改$ git reset --hard <commit-hash>用远端分支强制覆盖本地分支$ git reset --hard <remote/branch> e.g., upstream/master, origin/my-feature放弃某个文件的所有本地修改$ git checkout HEAD <file>删除添加.gitignore文件前错误提交的文件:$ git rm -r --cached . $ git add . $ git commit -m "remove xyz file"撤销远程修改(创建一个新的提交,并回滚到指定版本):$ git revert <commit-hash>彻底删除指定版本执行下面命令后,commit-hash 提交后的记录都会被彻底删除,使用需谨慎$ git reset --hard <commit-hash> $ git push -f更新与推送更新下载远程端版本,但不合并到HEAD中$ git fetch <remote>将远程端版本合并到本地版本中$ git pull origin master以rebase方式将远端分支与本地合并$ git pull --rebase <remote> <branch>推送将本地版本推送到远程端$ git push remote <remote> <branch>删除远程端分支$ git push <remote> :<branch> (since Git v1.5.0) $ git push <remote> --delete <branch> (since Git v1.7.0)发布标签$ git push --tags查看信息显示工作路径下已修改的文件:$ git status显示与上次提交版本文件的不同:$ git diff显示提交历史:从最新提交开始,显示所有的提交记录(显示hash, 作者信息,提交的标题和时间)$ git log显示某个用户的所有提交$ git log --author="username"显示某个文件的所有修改$ git log -p <file>显示搜索内容:从当前目录的所有文件中查找文本内容$ git grep "Hello"在某一版本中搜索文本$ git grep "Hello" v2.5分支增删查分支列出所有的分支$ git branch列出所有的远端分支$ git branch -r基于当前分支创建新分支$ git branch <new-branch>基于远程分支创建新的可追溯的分支$ git branch --track <new-branch> <remote-branch>删除本地分支$ git branch -d <branch>强制删除本地分支,将会丢失未合并的修改$ git branch -D <branch>切换分支:切换分支$ git checkout <branch>创建并切换到新分支$ git checkout -b <branch>标签将分支合并到当前HEAD中$ git merge <branch>
2023年06月16日
30 阅读
0 评论
0 点赞
2022-08-12
HTML笔记
BIYUEHU,严禁转载
2022年08月12日
540 阅读
0 评论
0 点赞
2022-08-09
JavaScript笔记1-ES5~6语法
暂无简介
2022年08月09日
607 阅读
0 评论
1 点赞
2020-12-05
MarkDown基础语法
什么是MarkDown?MarkDown是一种轻量级标记语言,创始人为约翰·格鲁伯(英语:John Gruber)。 它允许人们使用易读易写的纯文本格式编写文档,然后转换成有效的XHTML(或者HTML)文档。这种语言吸收了很多在电子邮件中已有的纯文本标记的特性。
2020年12月05日
52 阅读
0 评论
1 点赞