手写 new 简单实现
123456789101112131415/* 实现 new 基本原理*/function myNew() { let obj = {} let Con = [].shift.call(arguments) obj.__proto__ = Con.prototype let res = Con.apply(obj, arguments) return res instanceof Object ? res : obj}/* 以下是对实现的分析:- 创建⼀个空对象- 获取构造函数- 设置空对象的原型- 绑定 this 并执⾏构造函数- 确保返回值为对象 */
1234function myNew(obj, ...args) { let newObj = Object.create(obj.prototype) let result = obj.apply(newObj, args)}
手写call aplly bind
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556const obj = { name: 'jiujue', age: 18 }function print(...args) { console.log(this) console.log(...args)}print.myCall(obj, 1, 2, 3)Function.prototype.myCall = function(context = window) { if (typeof this !== 'function') { throw new TypeError('need a function') } context.fn = this const args = [...arguments].slice(1) const res = co ...
手写promise-简单实现
1234567891011121314151617181920212223242526272829303132333435363738class _Promise { constructor(exec) { _STATE_MAP = { FUlFILLED: 'FULFILLED', PADDING: 'PADDING', REJECT: 'REJECT' } _value = undefined _state = _STATE_MAP.PADDING _fulfilledFuncs = [] _rejectFuncs = [] exec(this.resolve.bind(this), this.reject.bind(this)) } resolve(val) { if (this._state === this._STATE_MAP.PADDING) { this._state = this._STATE_MAP.FUl ...
手写深拷贝-简单实现
12345678910111213141516171819202122232425function clone(obj) { if (typeof obj === 'object') { if (obj instanceof Array) { let res = [] for (let index = 0; index < obj.length; index++) { res[index] = clone(obj[index]) } return res } else if (obj instanceof Object) { let res = {} for (const key in obj) { res[key] = clone(obj[key]) } return res } // 这里还可以考虑其他特殊类型例如date regex } else { return ...
js 读取本地图片-作为上传图片的预览
12345678910111213141516171819202122232425<form action=""> file: <input id="fileDemo" type="file" name="avatar" /> <button>提交</button> </form> <div id="resImg"> <script> // 监听点击事件 document.querySelector('button').onclick = function(e) { //阻止默认提交行为 e.preventDefault() // 新建读取对象 var read ...
原生ajax 上传进度和下载进度
注意:
上传进度使用xhr.upload.onprogress事件.
下载进度使用xhr.onprogress事件.
上传 进度
12345678910111213141516171819202122232425262728293031323334<form> <input type="file" name="avatar"> <button>上传</button></form><!-- 设置一个进度条,这里使用h5新标签,开始隐藏 --><progress max="0" value="0" style="display: none"></progress><script> document.querySelector('form').onsubmit = function (e) { e.preventDefault(); ...
将数字 12345678 转化成 RMB 形式 如: 12,345,678
1234567891011121314151617let str = '1234132131232135678'let tmp = [...str].reverse()tmp = tmp .map((it, ind) => ind % 3 === 0 ? [tmp[ind], tmp[ind + 1], tmp[ind + 2]] .reverse() .filter((it) => it !== undefined) .join('') : undefined ) .filter((it) => it !== undefined) .reverse() .join(',')console.log(tmp)
axios 在vue中全局配置拦截器和baseurl
123456789101112131415import axios from 'axios'axios.defaults.baseURL = 'http://127.0.0.1:8888/api/private/v1/'axios.interceptors.request.use(config => { if (sessionStorage.getItem('token')) { // 判断token是否存在 config.headers.Authorization = sessionStorage.getItem('token') // 将token设置成请求头 } return config},err => { return Promise.reject(err)})Vue.prototype.$http = axios
vue-router 导航守卫
12345678910router.beforeEach((to, from, next) => { const token = window.sessionStorage.getItem('token') if (to.fullPath !== '/login' && !token) { console.log('no token,please login.') next('/login') } // 如果用户未能验证身份,则 `next` 会被调用两次 next()})
数据库: 存储过程/触发器
数据库: 存储过程/触发器(mysql)
我对数据库存储过程/触发器的理解
存储过程: 和编程里面的函数类似,只需要掉用,就会执行预先设定好的过程
触发器: 可以在每次sql操作的前后执行动作,钩子函数.(增强sql语句的功能)
简单练习
创建数据库12CREATE DATABASE `foodfactory` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
创建表 123456789101112131415161718192021222324CREATE TABLE `food` ( `id` int NOT NULL AUTO_INCREMENT, `fname` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL, `stock` varchar(255) DEFAULT NULL, `date` datetime DEFAULT NULL, PRIMARY KEY (`id`));CREATE TABLE `provi ...