Skip to content
2012 edited this page Jul 20, 2020 · 2 revisions

区别

原型链是基于原型实现的,多个原型连着一起就形成了原型链;而原型既是一个很隐秘的东西,又是一个很大众的东西。隐秘是因为它在代码中看不见、摸不着,没法直接通过原型的点运算符得到;大众是因为在 js 中到处可见,如 toString/call/apply/push/concat 等等,这些方法都从原型上来的。

直白点就是,点运算符访问属性值,如果在对象中找不到,就会找对象的原型,如果对象的原型也不存在该属性值,就继续找对象的原型的原型...以此类推,直到找到或某个原型为 null,这条链就形成了一条原型链

__proto__ vs prototype

  • prototype: 每个函数都有这个原型的指针,函数的实例通知原型实现继承、共享
  • __proto__: 每个对象(js 里一切都是对象,所以都有这个隐秘的原型)都有这个指针,指向它的构造函数的原型

每个构造函数都有一个原型对象(prototype),原型对象都包含一个指向构造函数的指针,而实例都包含一个指向原型对象的内部指针(隐士原型__proto__)。所有普通的原型链都指向Object.prototype。可以通过Object.create()实现原型继承

看例子说话:

function Test() {}
var ins = new Test();
var obj = {};
var reg = /test/;

Test.__proto__ === Function.prototype;
Test.prototype === { constructor: Test };
Test.constructor === Function;

ins.__proto__ === Test.prototype;
ins.prototype === undefined;
ins.constructor === Test;
ins.__proto__.__proto__ === Object.prototype;

obj.__proto__ === Object.prototype;
obj.prototype === undefined;
obj.constructor === Object;

reg.__proto__ === RegExp.prototype;
reg.prototype === undefined;
reg.constructor === RegExp;
reg.constructor.__proto__ === Object.__proto__;

Object.__proto__ === Function.prototype; // Object是一个构造函数

JS

  1. 作用域
  2. 闭包
  3. 原型(链)
  4. 模块
  5. 位操作符
  6. 事件循环
  7. eval

CSS

  1. float
  2. BFC
  3. position
  4. flex
  5. grid

DOM

  1. DOM
  2. how browser works

Node.js

  1. Stream
  2. Timers
  3. Child Processes
  4. HTTP
  5. File System

react

  1. 生命周期
  2. setState
  3. hook

git

  1. git 基础命令
  2. git rebase 理解
  3. git bisect
  4. git commit
  5. git hook

设计模式

  1. 策略模式
  2. ...

TCP/IP 协议

  1. HTTP/1.x
  2. HTTP/2
  3. SSL/TLS
  4. TCP
  5. DNS
  6. HTTP Cache
  7. CORS
  8. http status code

linux(shell)知识点

  1. bashrc vs profile
  2. vim
  3. shell基本语法
  4. shell 知识误区
  5. shell命令
  6. 鸟哥的Linux私房菜:基础学习篇
  7. sudo vs su
Clone this wiki locally