1.阅读VUE源码前需要提前了解的知识

Handlebars

模板引擎,识别HTML中的 {{}} 等

使用demo
https://7coder.top/demo1-1.html

<div id="app">
    <span>余额:{{ balance }}元</span>
  </div>
  <div id="app1"></div>
</div>
<script src="https://cdn.jsdelivr.net/npm/handlebars@latest/dist/handlebars.js"></script>
<script>
  const source = document.getElementById("app").innerHTML;
  const template = Handlebars.compile(source);
  let context = {balance: 100}
  document.getElementById('app1').innerHTML = template(context);
</script>

当然它还能实现一些条件判断和循环等,这里就不多讲了

Object.defineProperty

配合模板引擎实现一个操作数据及实时改变html的demo
https://7coder.top/demo1-2.html

在一个对象上定义一个新的属性,或者是修改已存在的属性。最终这个方法会返回该对象

Object.defineProperty(someOne, 'name', {
      value: '大石',           // 属性值
      writable: false,      // 该属性是否可写,
      configurable: false,  // 是否可删除
      enumerable: false,    //是否可for-in或Object.keys中列举出来
}) // sonmeOne.name = b

Object.defineProperty(someOne, 'name', {
    get: function(){        // 获取该属性值的回调
        return document.getElementById('introduce').innerHTML;
    },
    set: function(val){     // 设置该属性值的回调
        document.getElementById('introduce').innerHTML = val;
    }
})

使用Object.defineProperty创建的属性,writable,configurable,enumerable的默认值为false。
get、set不能与 writable、value 同时使用

flow

静态类型检测工具,将javascript从弱类型语言变成了强类型语言

  1. 基础数据类型检测
// 在定义变量的同时指定数据类型
let str:string = 'a'
let num:nnumber = 1

// 重新赋值
str = 'b' // error
num = 2  // error

支持的基础数据类型有boolean、number、string、null、void(即undefined)

  1. 复杂类型检测
// 对象类型
let a:Object = {b: 1}
// 对象类型中的 b 属性
let a1:{b:string} = {b: '1'}

// 数组类型
let numberArr: number[] = [1,2,3]
// 数组类型也可以这样写
let numberArr1: Array<number> = [1,2,3]
let booleanArr: Array<boolean> = [false,true]
// 第四个没声明的也可以这样写
let arr: [number,string,boolean] = [1,'2', false, null]

// 自定义类型
export class Observer {
 value: string;
 constructor (value: string) {
   // 省略
 }
} 

// 指定传入参数类型和返回值类型
function fn(arg:number,arg2:string):Object{
 return {
   arg,
   arg2
 }
}


使用flow.js 需要在babel中安装babel-preset-flow-vue插件

Object.keys

获取对象中所有的key,返回一个数组。

Object.prototype.c=3
let a = {a: 1,b: 2}
// for...in 会返回原型链上的c属性 但Object.keys不会
Object.keys({a: 1,b: 2}) // [a,b]
for(let i in a){} // a,b,c

Object.create(null)

创建纯净对象,可用作数据字典

Object.create(null) // {} 创建一个纯净的对象
let a = {}          

举个🌰

image

可以发现都是创建的一个对象,但是使用bject.create(null)创建的对象不具有原型链上的属性。
那么它有什么好处呢???

再举个🌰

Object.prototype.name="大石";
let my = {age: 18}
console.log(my.name) // 大石
// 我们在创建my这个对象的时候并没有指定name属性,但是他会继承来自父级object的name属性
// 那么如果想判断my.name是否存在的时候就会出现一些意向不到的情况

let you = Object.create(null)
you.age == "18"
console.log(you.name) // undefined
// 使用Object.create(null)则不会出现这样的情况

另一个使用create(null)的理由是,在我们使用for..in循环的时候会遍历对象原型链上的属性,使用create(null)就不必再对属性进行检查了,当然,我们也可以直接使用Object.keys[]。

Object.assign()

合并两个对象

const a = { a: 1, c: 2 }
const b = Object.assign({c: 4, d: 5}, a)
// b = {a:1, c:2, d:5}

Object.prototype.toString.call()

几乎完美判断每一种数据类型

Object.prototype.toString.call('') ;   // [object String]
Object.prototype.toString.call(1) ;    // [object Number]
Object.prototype.toString.call(true) ; // [object Boolean]
Object.prototype.toString.call(Symbol()); //[object Symbol]
Object.prototype.toString.call(undefined) ; // [object Undefined]
Object.prototype.toString.call(null) ; // [object Null]
Object.prototype.toString.call(new Function()) ; // [object Function]
Object.prototype.toString.call(new Date()) ; // [object Date]
Object.prototype.toString.call([]) ; // [object Array]
Object.prototype.toString.call(new RegExp()) ; // [object RegExp]
Object.prototype.toString.call(new Error()) ; // [object Error]
Object.prototype.toString.call(document) ; // [object HTMLDocument]
Object.prototype.toString.call(window) ; //[object global] window 是全局对象 global 的引用

看起来似乎很强大,但是为什么只能说是几乎完美呢

举个🌰

function Person(name, age) {
    this.name = name
    this.age = ageonePerson
}
var onePerson = new Person("大石", 18);
// 因为它不能判断是不是某一个类的实例
Object.prototype.toString.call(onePerson); // "[object Object]"
// 还是得用 instanceof
console.log(onePerson instanceof Person); // true

end

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,029评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,395评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,570评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,535评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,650评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,850评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,006评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,747评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,207评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,536评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,683评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,342评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,964评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,772评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,004评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,401评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,566评论 2 349