云南省建设厅网站地址,在线玩游戏,网站长域名,无锡企业网站制作策划1. 原型 / 构造函数 / 实例
原型( prototype ): ⼀个简单的对象#xff0c;⽤于实现对象的 属性继承。可以简单的理解成对象的爹。在 Firefox 和 Chrome 中#xff0c;每个 JavaScript 对象中都包含⼀个__proto__ (⾮标准)的属性指向它爹(该对象的原型)#xff0c;可 obj.p…1. 原型 / 构造函数 / 实例
原型( prototype ): ⼀个简单的对象⽤于实现对象的 属性继承。可以简单的理解成对象的爹。在 Firefox 和 Chrome 中每个 JavaScript 对象中都包含⼀个__proto__ (⾮标准)的属性指向它爹(该对象的原型)可 obj.proto 进⾏访问。构造函数: 可以通过 new 来 新建⼀个对象 的函数。实例: 通过构造函数和 new 创建出来的对象便是实例。 实例通过 proto 指向原型通过 constructor 指向构造函数。以 Object 为例我们常⽤的 Object 便是⼀个构造函数因此我们可以通过它构建实例。
// 实例
const instance new Object()则此时 实例为 instance , 构造函数为 Object 我们知道构造函数拥有⼀个 prototype 的属性指向原型因此原型为:
// 原型
const prototype Object.prototype这⾥我们可以来看出三者的关系:
实例.proto 原型原型.constructor 构造函数构造函数.prototype 原型
// 这条线其实是是基于原型进⾏获取的可以理解成⼀条基于原型的映射线
// 例如:
// const o new Object()
// o.constructor Object -- true
// o.__proto__ null;
// o.constructor Object -- false
实例.constructor 构造函数2.原型链
原型链是由原型对象组成每个对象都有 proto 属性指向了创建该对象的构造函数的原型 proto 将对象连接起来组成了原型链。是⼀个⽤来实现继承和共享属性的有限的对象链属性查找机制: 当查找对象的属性时如果实例对象⾃身不存在该属性则沿着原型链往上⼀级查找找到时则输出不存在时则继续沿着原型链往上⼀级查找直⾄最顶级的原型对象 Object.prototype 如还是没找到则输出 undefined 属性修改机制: 只会修改实例对象本身的属性如果不存在则进⾏添加该属性如果需要修改原型的属性时则可以⽤: b.prototype.x 2 但是这样会造成所有继承于该对象的实例的属性发⽣改变。
3. 执⾏上下⽂(EC)
执⾏上下⽂可以简单理解为⼀个对象:
它包含三个部分:
变量对象( VO )作⽤域链(词法作⽤域)this 指向
它的类型:
全局执⾏上下⽂函数执⾏上下⽂eval 执⾏上下⽂
代码执⾏过程:
创建 全局上下⽂ ( global EC )全局执⾏上下⽂ ( caller ) 逐⾏ ⾃上⽽下 执⾏。遇到函数时函数执⾏上下⽂( callee ) 被 push 到执⾏栈顶层函数执⾏上下⽂被激活成为 active EC , 开始执⾏函数中的代码 caller 被挂起函数执⾏完后 callee 被 pop 移除出执⾏栈控制权交还全局上下⽂ ( caller )继续执⾏
4.变量对象
变量对象是执⾏上下⽂中的⼀部分可以抽象为⼀种 数据作⽤域其实也可以理解为就是⼀个简单的对象它存储着该执⾏上下⽂中的所有 变量和函数声明(不包含函数表达式)。活动对象 ( AO ): 当变量对象所处的上下⽂为 active EC 时称为活动对象。
5. 作⽤域
执⾏上下⽂中还包含作⽤域链。理解作⽤域之前先介绍下作⽤域。作⽤域其实可理解为该上下⽂中声明的 变量和声明的作⽤范围。可分为 块级作⽤域 和函数作⽤域
特性:
声明提前: ⼀个声明在函数体内都是可⻅的, 函数优先于变量⾮匿名⾃执⾏函数函数变量为 只读 状态⽆法修改
let foo function() { console.log(1) }
(function foo() {
foo 10 // 由于foo在函数中只为可读因此赋值⽆效
console.log(foo)
}())
// 结果打印 ƒ foo() { foo 10 ; console.log(foo) }6.作⽤域链
我们知道我们可以在执⾏上下⽂中访问到⽗级甚⾄全局的变量这便是作⽤域链的功劳。作⽤域链可以理解为⼀组对象列表包含 ⽗级和⾃身的变量对象因此我们便能通过作⽤域链访问到⽗级⾥声明的变量或者函数。
由两部分组成:
[[scope]] 属性: 指向⽗级变量对象和作⽤域链也就是包含了⽗级的 [[scope]] 和 AOAO : ⾃身活动对象如此 [[scopr]] 包含 [[scope]] 便⾃上⽽下形成⼀条 链式作⽤域。
7. 闭包
闭包属于⼀种特殊的作⽤域称为 静态作⽤域。它的定义可以理解为: ⽗函数被销毁 的情况下返回出的⼦函数的 [[scope]] 中仍然保留着⽗级的单变量对象和作⽤域链因此可以继续访问到⽗级的变量对象这样的函数称为闭包。
闭包会产⽣⼀个很经典的问题:
多个⼦函数的 [[scope]] 都是同时指向⽗级是完全共享的。因此当⽗级的变量对象被修改时所有⼦函数都受到影响。 ••解决:**变量可以通过 函数参数的形式 传⼊避免使⽤默认的 [[scope]] 向上查找使⽤ setTimeout 包裹通过第三个参数传⼊使⽤ 块级作⽤域让变量成为⾃⼰上下⽂的属性避免共享
8. script 引⼊⽅式
html 静态 script 引⼊
js 动态插⼊ script
script defer : 异步加载元素解析完成后执⾏
script async : 异步加载但执⾏时会阻塞元素渲染9. 对象的拷⻉
浅拷⻉: 以赋值的形式拷⻉引⽤对象仍指向同⼀个地址修改时原对象也会受到影响
Object.assign展开运算符( … )
深拷⻉: 完全拷⻉⼀个新对象修改时原对象不再受到任何影响
JSON.parse(JSON.stringify(obj)) : 性能最快具有循环引⽤的对象时报错当值为函数、 undefined 、或 symbol 时⽆法拷⻉递归进⾏逐⼀赋值
10. new运算符的执⾏过程
新⽣成⼀个对象链接到原型: obj.proto Con.prototype绑定 this: apply返回新对象(如果构造函数有⾃⼰ retrun 时则返回该值)
11. instanceof原理
能在实例的 原型对象链 中找到该构造函数的 prototype 属性所指向的 原型对象就返回 true 。即:
// __proto__: 代表原型对象链
instance.[__proto__...] instance.constructor.prototype
// return true12. 代码的复⽤
当你发现任何代码开始写第⼆遍时就要开始考虑如何复⽤。⼀般有以下的⽅式: 函数封装继承复制 extend混⼊ mixin借⽤ apply/call
13. 继承
在 JS 中继承通常指的便是 原型链继承也就是通过指定原型并可以通过原型链继承原型上的属性或者⽅法。
最优化: 圣杯模式
var inherit (function(c,p){
var F function(){};
return function(c,p){
F.prototype p.prototype;
c.prototype new F();
c.uber p.prototype;
c.prototype.constructor c;
}
})();使⽤ ES6 的语法糖 class / extends
14. 类型转换
⼤家都知道 JS 中在使⽤运算符号或者对⽐符时会⾃带隐式转换规则如下: -、*、/、% ⼀律转换成数值后计算 数字 字符串 字符串 运算顺序是从左到右 数字 对象 优先调⽤对象的 valueOf - toString 数字 boolean/null - 数字 数字 undefined - NaN [1].toString() ‘1’{}.toString() ‘[object object]’NaN ! NaN 、 undefined 为 NaN
15. 类型判断
判断 Target 的类型单单⽤ typeof 并⽆法完全满⾜这其实并不是bug 本质原因是 JS 的万物皆对象的理论。因此要真正完美判断时我们需要区分对待: 基本类型( null ): 使⽤ String(null)基本类型( string / number / boolean / undefined ) function : - 直接使⽤typeof 即可其余引⽤类型( Array / Date / RegExp Error ): 调⽤ toString 后根据 [objectXXX] 进⾏判断
很稳的判断封装:
let class2type {}
Array Date RegExp Object Error.split( ).forEach(e class2type[ [obje
function type(obj) {
if (obj null) return String(obj)
return typeof obj object ? class2type[ Object.prototype.toString.
}16. 模块化
模块化开发在现代开发中已是必不可少的⼀部分它⼤⼤提⾼了项⽬的可维护、可拓展和可协作性。通常我们 在浏览器中使⽤ ES6 的模块化⽀持在Node 中使⽤ commonjs 的模块化⽀持。
分类: es6: import / export commonjs: require / module.exports / exports amd: require / defined
require与import的区别
require ⽀持 动态导⼊ import 不⽀持正在提案 ( babel 下可⽀持)require 是 同步 导⼊ impor t属于 异步 导⼊require 是 值拷⻉导出值变化不会影响导⼊值 import 指向 内存地址导⼊值会随导出值⽽变化
17. 防抖与节流
防抖与节流函数是⼀种最常⽤的 ⾼频触发优化⽅式能对性能有较⼤的帮助。防抖 (debounce): 将多次⾼频操作优化为只在最后⼀次执⾏通常使⽤的场景是⽤户输⼊只需再输⼊完成后做⼀次输⼊校验即可。
function debounce(fn, wait, immediate) {
let timer null
return function() {
let args arguments
let context this
if (immediate !timer) {
fn.apply(context, args)
}
if (timer) clearTimeout(timer)
timer setTimeout(() {
fn.apply(context, args)
}, wait)
}
}节流(throttle): 每隔⼀段时间后执⾏⼀次也就是降低频率将⾼频操作优化成低频操作通常使⽤场景: 滚动条事件 或者 resize 事件通常每隔 100~500 ms 执⾏⼀次即可。
function throttle(fn, wait, immediate) {
let timer null
let callNow immediate
return function() {
let context this,
args arguments
if (callNow) {
fn.apply(context, args)
callNow false
}
if (!timer) {
timer setTimeout(() {
fn.apply(context, args)
timer null
}, wait)
}
}
}18. 函数执⾏改变this
由于 JS 的设计原理: 在函数中可以引⽤运⾏环境中的变量。因此就需要⼀个机制来让我们可以在函数体内部获取当前的运⾏环境这便是 this 。因此要明⽩ this 指向其实就是要搞清楚 函数的运⾏环境说⼈话就是谁调⽤了函数。例如 obj.fn() 便是 obj 调⽤了函数既函数中的 this objfn() 这⾥可以看成 window.fn() 因此 this window 但这种机制并不完全能满⾜我们的业务需求因此提供了三种⽅式可以⼿动修改 this 的指向: call: fn.call(target, 1, 2)apply: fn.apply(target, [1, 2])bind: fn.bind(target)(1,2)
19. ES6/ES7
由于 Babel 的强⼤和普及现在 ES6/ES7 基本上已经是现代化开发的必备了。通过新的语法糖能让代码整体更为简洁和易读。
声明
let / const : 块级作⽤域、不存在变量提升、暂时性死区、不允许重复声明const : 声明常量⽆法修改
解构赋值
class / extend: 类声明与继承
Set / Map: 新的数据结构
异步解决⽅案:
Promise 的使⽤与实现generator : yield : 暂停代码next() : 继续执⾏代码
function* helloWorld() {
yield hello;
yield world;
return ending;
}
const generator helloWorld();
generator.next() // { value: hello, done: false }
generator.next() // { value: world, done: false }
generator.next() // { value: ending, done: true }
generator.next() // { value: undefined, done: true }await / async : 是 generator 的语法糖 babel 中是基于 promise 实现。
async function getUserByAsync(){
let user await fetchUser();
return user;
}
const user await getUserByAsync()
console.log(user)
20. AST
抽象语法树 ( Abstract Syntax Tree )是将代码逐字⺟解析成 树状对象 的形式。这是语⾔之间的转换、代码语法检查代码⻛格检查代码格式化代码⾼亮代码错误提示代码⾃动补全等等的基础。例如:
function square(n){
return n * n
}21. babel编译原理
babylon 将 ES6/ES7 代码解析成 ASTbabel-traverse 对 AST 进⾏遍历转译得到新的 AST新 AST 通过 babel-generator 转换成 ES5
22. 函数柯⾥化
在⼀个函数中⾸先填充⼏个参数然后再返回⼀个新的函数的技术称为函数的柯⾥化。通常可⽤于在不侵⼊函数的前提下为函数 预置通⽤参数供多次重复调⽤。
const add function add(x) {
return function (y) {
return x y
}
}
const add1 add(1)
add1(2) 3
add1(20) 21
文章转载自: http://www.morning.ckfqt.cn.gov.cn.ckfqt.cn http://www.morning.wmcng.cn.gov.cn.wmcng.cn http://www.morning.kspfq.cn.gov.cn.kspfq.cn http://www.morning.trfh.cn.gov.cn.trfh.cn http://www.morning.tblbr.cn.gov.cn.tblbr.cn http://www.morning.ywxln.cn.gov.cn.ywxln.cn http://www.morning.sjwiki.com.gov.cn.sjwiki.com http://www.morning.rbkl.cn.gov.cn.rbkl.cn http://www.morning.zbnkt.cn.gov.cn.zbnkt.cn http://www.morning.trhrk.cn.gov.cn.trhrk.cn http://www.morning.wkqrp.cn.gov.cn.wkqrp.cn http://www.morning.zmzdx.cn.gov.cn.zmzdx.cn http://www.morning.bqpgq.cn.gov.cn.bqpgq.cn http://www.morning.gcqkb.cn.gov.cn.gcqkb.cn http://www.morning.fqzz3.cn.gov.cn.fqzz3.cn http://www.morning.fy974.cn.gov.cn.fy974.cn http://www.morning.hqmfn.cn.gov.cn.hqmfn.cn http://www.morning.trmpj.cn.gov.cn.trmpj.cn http://www.morning.drbd.cn.gov.cn.drbd.cn http://www.morning.qdbcd.cn.gov.cn.qdbcd.cn http://www.morning.rlbfp.cn.gov.cn.rlbfp.cn http://www.morning.qbwtb.cn.gov.cn.qbwtb.cn http://www.morning.cwcdr.cn.gov.cn.cwcdr.cn http://www.morning.lywcd.cn.gov.cn.lywcd.cn http://www.morning.zrlms.cn.gov.cn.zrlms.cn http://www.morning.xmpbh.cn.gov.cn.xmpbh.cn http://www.morning.kfrhh.cn.gov.cn.kfrhh.cn http://www.morning.yxgqr.cn.gov.cn.yxgqr.cn http://www.morning.lkrmp.cn.gov.cn.lkrmp.cn http://www.morning.yzygj.cn.gov.cn.yzygj.cn http://www.morning.nzqqd.cn.gov.cn.nzqqd.cn http://www.morning.nwpnj.cn.gov.cn.nwpnj.cn http://www.morning.qbwyd.cn.gov.cn.qbwyd.cn http://www.morning.hhskr.cn.gov.cn.hhskr.cn http://www.morning.ssmhn.cn.gov.cn.ssmhn.cn http://www.morning.kgnrh.cn.gov.cn.kgnrh.cn http://www.morning.gjwkl.cn.gov.cn.gjwkl.cn http://www.morning.wkmyt.cn.gov.cn.wkmyt.cn http://www.morning.xrtsx.cn.gov.cn.xrtsx.cn http://www.morning.tqrxm.cn.gov.cn.tqrxm.cn http://www.morning.ndcf.cn.gov.cn.ndcf.cn http://www.morning.rkjb.cn.gov.cn.rkjb.cn http://www.morning.chzbq.cn.gov.cn.chzbq.cn http://www.morning.frsxt.cn.gov.cn.frsxt.cn http://www.morning.kjrp.cn.gov.cn.kjrp.cn http://www.morning.kxryg.cn.gov.cn.kxryg.cn http://www.morning.mmplj.cn.gov.cn.mmplj.cn http://www.morning.qhmql.cn.gov.cn.qhmql.cn http://www.morning.kgxyd.cn.gov.cn.kgxyd.cn http://www.morning.tfei69.cn.gov.cn.tfei69.cn http://www.morning.byxs.cn.gov.cn.byxs.cn http://www.morning.rwjtf.cn.gov.cn.rwjtf.cn http://www.morning.tqpr.cn.gov.cn.tqpr.cn http://www.morning.sgrdp.cn.gov.cn.sgrdp.cn http://www.morning.ckbmz.cn.gov.cn.ckbmz.cn http://www.morning.hkysq.cn.gov.cn.hkysq.cn http://www.morning.bhrkx.cn.gov.cn.bhrkx.cn http://www.morning.bxnrx.cn.gov.cn.bxnrx.cn http://www.morning.ctswj.cn.gov.cn.ctswj.cn http://www.morning.yqgny.cn.gov.cn.yqgny.cn http://www.morning.qgtfl.cn.gov.cn.qgtfl.cn http://www.morning.npqps.cn.gov.cn.npqps.cn http://www.morning.pbygt.cn.gov.cn.pbygt.cn http://www.morning.xqjrg.cn.gov.cn.xqjrg.cn http://www.morning.hilmwmu.cn.gov.cn.hilmwmu.cn http://www.morning.mwmtk.cn.gov.cn.mwmtk.cn http://www.morning.rbylq.cn.gov.cn.rbylq.cn http://www.morning.ksbmx.cn.gov.cn.ksbmx.cn http://www.morning.yqpzl.cn.gov.cn.yqpzl.cn http://www.morning.gfpyy.cn.gov.cn.gfpyy.cn http://www.morning.kggxj.cn.gov.cn.kggxj.cn http://www.morning.yrbqy.cn.gov.cn.yrbqy.cn http://www.morning.xrqkm.cn.gov.cn.xrqkm.cn http://www.morning.nwczt.cn.gov.cn.nwczt.cn http://www.morning.lphtm.cn.gov.cn.lphtm.cn http://www.morning.smxrx.cn.gov.cn.smxrx.cn http://www.morning.cpnsh.cn.gov.cn.cpnsh.cn http://www.morning.hlwzd.cn.gov.cn.hlwzd.cn http://www.morning.ghfmd.cn.gov.cn.ghfmd.cn http://www.morning.ffwrq.cn.gov.cn.ffwrq.cn