vue.js 源代码学习笔记 ----

发布时间:2017-7-9 7:20:56编辑:www.fx114.net 分享查询网我要评论
本篇文章主要介绍了"vue.js 源代码学习笔记 ----",主要涉及到vue.js 源代码学习笔记 ----方面的内容,对于vue.js 源代码学习笔记 ----感兴趣的同学可以参考一下。

/* * not type checking this file because flow doesn't play well with * dynamically accessing methods on Array prototype */import { def } from '../util/index'const arrayProto = Array.prototype

// Object.create 如果传入的是数组, 那么这个数组会被封装成一个对象,这个对象作为目标对象的__proto__属性缓存起来
// arrayMethods变成一个新对象, 通过 arrayMethods.__proto__.concat可以访问到原来的数组方法
// 这样就为 Object.definedProperty创造了条件
export const arrayMethods
= Object.create(arrayProto)/** * Intercept mutating methods and emit events
这几个操作都会改变数组本身, 像slice不会改变数组本身, 这里没列出
*/;[ 'push', 'pop', 'shift', 'unshift', 'splice', 'sort', 'reverse'].forEach(function (method) { // cache original method 获得数组的原型方法, 并缓存 const original = arrayProto[method]

// arrayMethods 已经是一个对象, 带有__proto__属性, 下有各种原生数组方法 def(arrayMethods, method,
function mutator () { // avoid leaking arguments: // http://jsperf.com/closure-with-arguments let i = arguments.length

//作者看上去不喜欢用 [].slice.call , 具体没明白, 好像是slice获取arguments在有的浏览器会有参数泄露问题. const args
= new Array(i)
while (i--) { args[i] = arguments[i] }

//先执行原生的方法, 这里的this 就是指向 arrayMethods
const result
= original.apply(this, args) const ob = this.__ob__
let inserted
switch (method) { case 'push': inserted = args break case 'unshift': inserted = args break case 'splice':
     //因为 siplce (0,2,a,b) 这里是要取得新插入的数组值 a b inserted
= args.slice(2) break }

//如果有新增的值, 监听一下
if (inserted) ob.observeArray(inserted) // notify change 通知改变 ob.dep.notify() return result })


上一篇:数据挖掘基本概念讲解
下一篇:TCP传输

相关文章

相关评论

本站评论功能暂时取消,后续此功能例行通知。

一、不得利用本站危害国家安全、泄露国家秘密,不得侵犯国家社会集体的和公民的合法权益,不得利用本站制作、复制和传播不法有害信息!

二、互相尊重,对自己的言论和行为负责。

好贷网好贷款