1. JavaScript 中的 __proto__ 和 prototype

    当你创建函数时,JS会为这个函数自动添加prototype属性,值是空对象。而一旦你把这个函数当作构造函数(constructor)调用(即通过new关键字调用),那么JS就会帮你创建该构造函数的实例,实例继承构造函数prototype的所有属性和方法(实例通过设置自己的__proto__指向承构造函数的prototype来实现这种继承)。 对象的__proto__指向自己构造函数的prototype。obj.__proto__.__proto__…的原型链由此产生,包括我们的操作符instanceof正是通过探测obj.__proto__.__proto__… === Constructor.prototype来验证obj是否是Constructor的实例。 原型链的尽头(root)是Object.prototype。所有对象均从Object.prototype继承属性。 先有Object.prototype(原型链顶端),Function.prototype继承Object.prototype而产生,最后,Function和Object和其它构造函数继承Function.prototype而产生。 prototype 每个函数都有一个属性叫做prototype,这个prototype的属性值是一个对象(属性的集合),默认的只有一个叫做constructor的属性,指向这个函数本身。 prototype 作为一个对象是可以塞很多属性和方法的。 __proto__ 每个对象都有一个隐式原型。每个对象都有一个__proto__属性,指向创建该对象的函数的prototype。 因为函数也是一种对象,所以函数也有__proto__。 Object.__proto__ === Function.prototype

  2. 浅尝 service worker

    最早听说service worker的时候是团队的分享会上,之后就听说了饿了么pwa改造,技术学习的脚步始终不能停。 对于一个新技术,它能做什么?它能给我带来什么?这一直是我在学习之前会反问的问题。 Service workers 本质上充当Web应用程序与浏览器之间的代理服务器,也可以在网络可用时作为浏览器和网络间的代理。它们旨在(除其他之外)使得能够创建有效的离线体验,拦截网络请求并基于网络是否可用以及更新的资源是否驻留在服务器上来采取适当的动作。他们还允许访问推送通知和后台同步API。 普通的浏览器环境下我们一般用它来缓存资源,提升页面打开速度。其他使用场景如下: 后台数据同步 响应来自其它源的资源请求 集中接收计算成本高的数据更新,比如地理位置和陀螺仪信息,这样多个页面就可以利用同一组数据 在客户端进行CoffeeScript,LESS,CJS/AMD等模块编译和依赖管理(用于开发目的) 后台服务钩子 自定义模板用于特定URL模式 性能增强,比如预取用户可能需要的资源,比如相册中的后面数张图片 第四点在 React的开发配置项里就有体现,利用官方的create-react-app就会有一个service worker 文件。 出于安全原因,Service Workers 要求要在必须在 HTTPS 下才能运行。为了便于本地开发,localhost 也被浏览器认为是安全源。 在 Firefox 的 private browsing mode 隐私模式下是无法使用 service worker 的,但是chrome 的隐私模式可以使用。 注意: localStorage 跟  service worker 的 cache 工作原理很类似,但是它是同步的,所以不允许在  service workers 内使用。 注意: IndexedDB 可以在  service worker 内做数据存储。 var VERSION = ‘v1’; //开始缓存 self.addEventListener(‘install’,function(event) { event.waitUntil(…