一、原型、原型链
原型
每个实例对象( object )都有一个私有属性(称之为__proto__ )指向它的构造函数的原型对象(prototype )。该原型对象也有一个自己的原型对象__proto__ ,层层向上直到一个对象的原型对象为 null。根据定义,null 没有原型,并作为这个原型链中的最后一个环节。
JavaScript有句话,一切皆为对象,其实是不严谨的, 比如 null 和 undefined 就不是对象,除此之外,都是对象。Javascript 对象都有一个叫做原型的公共属性,属性名是__proto__。这个原型属性是对另一个对象的引用,通过这个原型属性我们就可以访问另一个对象所有的属性和方法。比如:
let Array = [1, 2, -1, 4, 3, 8]
总结: 每一个实例对象都有一个私有属性__proto__,指向它的构造函数的原型对象(prototype)。
原型链
原型链:每个被实例的对象都有__proto__对象,它指向了构造该对象的构造函数的 prototype 属性。同时该对象可以通过__proto__对象来寻找不属于自身的属性。
1.每个函数对象都有一个 prototype 属性,这个属性就是函数的原型对象。
2.原型链是 JavaScript 实现继承的重要方式,原型链的形成是真正的靠__proto__ 而非 prototype。
二、闭包
闭包就是有权访问一个函数内部变量的函数,也就是常说的函数内部嵌套函数,内部函数访问外部函数变量,从而导致垃圾回收机制没有将当前变量回收掉。这样的操作,有可能会带来内存泄漏。好处就是可以设计私有的方法和变量。
详解可参考:www.alloyteam.com/2019/07/clo…
闭包的应用场景:
- setTimeout原生的setTimeout有一个缺陷,你传递的第一个函数不能带参数就可以用闭包来实现传参效果;
- 回调;
- 函数防抖,节流;(防抖:函数被高频触发时停止触发后延时n秒再执行函数;节流:函数被高频触发时延时n秒才会执行)
- 封装私有变量;
三、js 跨域
目前暂时已知的跨域方法是:
- jsonp跨域,原理:script标签没有跨域限制的漏洞实现的一种跨域方法,只支持get请求。安全问题会受到威胁。
- cors跨域,通过后端服务器实现,Access-Control-Allow-Origin。
- postMessage window 的一个属性方法。
- websocket。
- nginx 反向代理。
- iframe 跨域。
还有一个跨域:
webpack proxy 跨域只能用作与开发阶段,临时解决本地请求服务器产生的跨域问题。并不适合线上环境。配置在webpack的devServer属性中。
webpack中的devsever配置后,打包阶段在本地临时生成了一个node服务器,浏览器请求服务器相当于请求本地服务。
四、get post 的区别
-
对 get 和 post 区别的错误理解一:get安全性非常低,post安全性较高。
-
对 get 和 post 区别的错误理解二:get传送的数据量较小,不能大于2KB。post传送的数据量较大,一般被默认为不受限制。
区别:
1. get是获取数据的,而post是提交数据的。
注:HTTP请求,最初设定了八种方法。这八种方法本质上没有任何区别。只是让请求,更加有语义而已。
- OPTIONS 返回服务器所支持的请求方法;
- GET 向服务器获取指定资源;
- HEAD 与GET一致,只不过响应体不返回,只返回响应头;
- POST 向服务器提交数据,数据放在请求体里;
- PUT 与POST相似,只是具有幂等特性,一般用于更新;
- DELETE 删除服务器指定资源;
- TRACE 回显服务器端收到的请求,测试的时候会用到这个;
- CONNECT 预留,暂无使用;
2. GET 用于获取信息,是无副作用的,是幂等的,且可缓存, 而POST 用于修改服务器上的数据,有副作用,非幂等,不可缓存。
当然还有关于 GET 和 POST 的 TCP 连接的问题,我不敢确定所以不敢瞎说,深入理解后,再来补上。 还有更多的区别,关于它们谁更安全啊?有没有限制啊?在上面的误区中已经写过了。 当然,GET和POST本质上并没有什么区别,GET和POST是就是HTTP协议中的两种发送请求的方法。
HTTP 是什么?HTTP是基于 TCP/IP 的关于数据如何在万维网中如何通信的协议。
HTTP 的底层是 TCP/IP。所以 GET 和 POST 的底层也是TCP/IP,也就是说,GET/POST 都是 TCP 链接。 GET 和 POST 能做的事情是一样的。你要给 GET 加上 request body,给 POST 带上 url 参数,技术上是完全行的通的。