/* @flow */ import { hasOwn, isObject, isPlainObject, capitalize, hyphenate } from 'shared/util' import { observe, observerState } from '../observer/index' import { warn } from './debug' type PropOptions = { type: Function | Array<Function> | null,…
/* @flow */ /* globals MutationObserver */ import { noop } from 'shared/util' // can we use __proto__? 有些浏览器不能让你明目张胆的使用 __proto__ export const hasProto = '__proto__' in {} // Browser environment sniffing 这里作者不太严谨, 直接用 navigator.userAget 判断浏览器 //利用 wi…
/* @flow */ import Vue from '../instance/index' import config from '../config' import { warn } from './debug' import { set } from '../observer/index' import { extend, isPlainObject, hasOwn, camelize, capitalize, isBuiltInTag } from 'shared/util' /**…
/* @flow */ /** * Convert a value to a string that is actually rendered. { .. } [ .. ] 2 => '' */ export function _toString (val: any): string { return val == null ? '' : typeof val === 'object' ? JSON.stringify(val, null, 2) //2 是控制字符串系列化后的空格为2 : St…
/* @flow */ // Object.freeze 使得这个对象不能增加属性, 修改属性, 这样就保证了这个对象在任何时候都是空的 export const emptyObject = Object.freeze({}) /** * Check if a string starts with $ or _ ascii unicode 的区别 charcodeAt是一个字符的 unicode编码, 但是像 0x24 (代表的是 $ ) 0x5f (代表的是 _ ) 因为是字符, 先存着asc…
import { inBrowser } from './env' export let mark export let measure if (process.env.NODE_ENV !== 'production') { //如果在浏览器环境, const perf = inBrowser &&window.performance /* istanbul ignore if */ if ( perf && perf.mark && perf.measu…
import config from '../config' import { warn } from './debug' import { inBrowser } from './env' // 这个方法先调用用户配置的 erroHandler 方法输出, 如果没有配置, 在开发测试环境调用warn输出, 在非浏览器环境用 throw抛出错误 export function handleError (err, vm, info) { if (config.errorHandler) { con…
import config from '../config' import { noop } from 'shared/util' let warn = noop let tip = noop let formatComponentName //如果是在开发环境 或者 在测试环境 if (process.env.NODE_ENV !== 'production') { //如果 有 window.console, 这里用typeof判断, 是因为如果用 if(window.console) //…
/* @flow */ import Dep from '../observer/dep' import Watcher from '../observer/watcher' import { set, del, observe, observerState, defineReactive } from '../observer/index' import { warn, bind, noop, hasOwn, isReserved, handleError, validateProp, isP…
参考 vue 2.2.6版本 /* @flow */ //引入订阅者模式 import Dep from './dep' import { arrayMethods } from './array' import { def, isObject, isPlainObject, hasProto, hasOwn, warn, isServerRendering } from '../util/index' const arrayKeys = Object.getOwnPropertyNames(a…