当前位置: 首页 > news >正文

响应式网站建设视频教程/seo排名优化什么意思

响应式网站建设视频教程,seo排名优化什么意思,产品设计排版模板,自动关联已发布文章wordpress最近偷懒好久没有写博客了,一直想继续Vue学习系列,想深入Vue源码来写。结果发现自己层次不够,对js的理解差好多。所以一直想写一直搁置着。最近重新振作决心看完Vue源码,并且以我们这类前端小白的角度来一步步弄懂Vue源码。PS&…

最近偷懒好久没有写博客了,一直想继续Vue学习系列,想深入Vue源码来写。结果发现自己层次不够,对js的理解差好多。所以一直想写一直搁置着。最近重新振作决心看完Vue源码,并且以我们这类前端小白的角度来一步步弄懂Vue源码。

PS:以下文章为笔记类,记录了本人在看源码过程中的一些问题和感悟。

Vue源码的本质是什么

Vue.js 本质上就是一个包含各种逻辑的一个function。而我们通常初始化Vue的过程就是实例化的过程。

var vm = new Vue({})

话不多说,老规矩用代码说话!
让我们来对Vue进行打印:

var vm = new Vue({...
})console.log(Vue)
console.log(vm)

打印结果如图:
vue

这里可以看到Vue$3这个方法,就是这个方法对Vue对象的构造函数了。其实这很简单,我们自己都可以造出一个Vue$4

    function Vue$4(options) {this.options = options}Vue$4.prototype.name = "小东西"Vue$4.prototype.age = 27console.log(new Vue$4("很好"))

显示结果如图
vue$4

综上所述,Vue对象的本质就是一个function,与我们的Vue$4的不同之处只在于逻辑的多与少。

必须理解Object对象

在Vue的源码中,出场率最多的应该就数Object对象的使用上了。可以这么说,不懂Object都没法往下看代码。以下是源码中用到的比较多的。

  • Object.defineProperty 直接在一个对象上定义一个新属性,或者修改一个对象的现有属性, 并返回这个对象。
  • Object.create 使用指定的原型对象及其属性去创建一个新的对象。
  • Object.keys 返回一个由一个给定对象的自身可枚举属性组成的数组,数组中属性名的排列顺序和使用 for...in 循环遍历该对象时返回的顺序一致 (两者的主要区别是 一个 for-in 循环还会枚举其原型链上的属性)。
  • Object.prototype Object的原型对象。
  • Object.freeze 冻结一个对象,冻结指的是不能向这个对象添加新的属性,不能修改其已有属性的值,不能删除已有属性,以及不能修改该对象已有属性的可枚举性、可配置性、可写性。也就是说,这个对象永远是不可变的。该方法返回被冻结的对象。

那么,Vue中哪个是Object呢?我们继续试验:

console.log(typeof Vue)
console.log(typeof new Vue())

输出结果

function
object

结果显示,使用new来创建的Vue实例就是个对象,所以一切对Object的操作行为都是针对Vue实例对象的。

理解setter和getter

在网上看Vue的评论是经常会听到说

Vue无非就是setter和getter方法的运用而已

这让我等新手一脸懵逼,这里我们就来认识认识setter和getter。
当我们在获取一个Vue实例data中的某个对象,如果你用console打印出来会发现,对象属性中除了常规的对象属性和__proto__对象之外还会多一个set和一个get方法,所谓的setter和getter就是它们。Vue给每一个对象属性都添加了Observer观察数据的获取和修改。好吧,贴代码一睹真容。

function defineReactive (obj,key,val,customSetter,shallow
) {var dep = new Dep();// Object.getOwnPropertyDescriptor() 方法返回指定对象上一个自有属性对应的属性描述符。//(自有属性指的是直接赋予该对象的属性,不需要从原型链上进行查找的属性)// 对象、属性名称、描述~var property = Object.getOwnPropertyDescriptor(obj, key);// 当且仅当该属性的 configurable 为 true 时,该属性描述符才能够被改变,同时该属性也能从对应的对象上被删除。默认为 false。if (property && property.configurable === false) {return}// cater for pre-defined getter/settersvar getter = property && property.get;var setter = property && property.set;var childOb = !shallow && observe(val);Object.defineProperty(obj, key, {enumerable: true,configurable: true,get: function reactiveGetter () {var value = getter ? getter.call(obj) : val;if (Dep.target) { // Watcherdep.depend();if (childOb) {childOb.dep.depend();if (Array.isArray(value)) {dependArray(value);}}}return value},set: function reactiveSetter (newVal) {var value = getter ? getter.call(obj) : val;/* eslint-disable no-self-compare */if (newVal === value || (newVal !== newVal && value !== value)) {return}/* eslint-enable no-self-compare */if ("development" !== 'production' && customSetter) {customSetter(); // 自定义setter}if (setter) {setter.call(obj, newVal);} else {val = newVal;}childOb = !shallow && observe(newVal);dep.notify();}});
}

代码太长?懵逼了?没关系,我们自己来造一个简单的setter和getter来了解一下。
其实用的就是Object.defineProperty方法中就有set和get。

  • get 一个给属性提供 getter 的方法,如果没有 getter 则为 undefined。该方法返回值被用作属性值。默认为 undefined。
  • set 一个给属性提供 setter 的方法,如果没有 setter 则为 undefined。该方法将接受唯一参数,并将该参数的新值分配给该属性。默认为 undefined。

好了,写代码~

    var obj = {}var mValue = "abc"Object.defineProperty(obj, "_name", {configurable: false, enumerable: false, get: function reactiveGetter () {return mValue},set: function reactiveSetter (val) {mValue = val}})obj._name = "rose"console.log(obj)

到这里我们打印log,对象属性的set和get方法就出现了。
打印结果

逻辑运算符的使用

在源码中有很多逻辑运算符的使用,有些运用的很巧妙。这里也科普下吧~

首先知道下可以转换成false的值,如下:

  • null
  • NaN
  • 0
  • 空字符串("")
  • undefined

用法一:判断条件返回true或者false

这是最基本的用法。

if (a & a.master & a.master.name) {} // 如果这三个属性都为true值,执行if逻辑
if (a || b) {} // 如果a或者b为true值,执行if逻辑。

用法二:判断并返回条件对象

  • && 如果几个条件都为true,则返回最后一个条件。
  • || 几个条件从前往后逐一判断,如果那个条件为true,返回该条件,否则返回最后一个条件。
var getter = property && property.get;  // 如果两个属性都存在,将property.get赋值给getter
e && e.__ob__ && e.__ob__.dep.depend(); // 如果三个属性都存在,执行第三条语句的方法
var res = assets[id] || assets[camelizedId] || assets[PascalCaseId]; 
// 给res赋值,如果assets[id]为true,则将其传res;
// 如果assets[camelizedId]为true,将其传给res;
// 如果前两者都为false,将assets[PascalCaseId]传给res。
var strat = strats[key] || defaultStrat;

然后,我对各种情况做了试验得出以下结论:

  • && 判断中,判断值都为 true,返回最后一个判断值;判断值中有 false
    值,返回第一个 false 值。
  • || 判断中,判断值都为 true,返回第一个判断值;判断值中有 true 值也有 false 值,返回第一个为 true 的判断值;如果判断值都为 false,返回最后面的 false 值。

注意:这里所说的返回 false 值不一定是 Boolean 类型的 false,也可能是 0、null 等非值,详见上文。

用法三:使用两个非

两个感叹号会确保参数为非值时只能为false,不会是0、空字符串、undefined等非值。

if (options) {this.deep = !!options.deep;this.user = !!options.user;this.lazy = !!options.lazy;this.sync = !!options.sync;} else {this.deep = this.user = this.lazy = this.sync = false;}

未完待续

还在学习Vue源码中……看了很多文章、也看了一遍源码。内容太多,千头万绪,容我理清之后,用自己的文字把Vue的源码学习记录分享出来。一些值得记录下来的知识点和心得会继续在本文中更新。
最后,想学习Vue源码的同学可以去买《Vue.js权威指南》这本书,虽然许多章节内容和官网是重复的,不过源码解析部分值得一看。我也正配合着这本书和源码在学习Vue。

http://www.jmfq.cn/news/4749571.html

相关文章:

  • 优秀网页设计作品网站/数据分析培训
  • 深圳网站建设公司好/网店如何做推广
  • 海门城乡建设管理局网站/聚名网域名注册
  • 如何做psd的模板下载网站/可以推广的平台
  • 贵州省城乡建设厅官网/宁波百度seo排名优化
  • 专门做包装的网站/免费发布网站seo外链
  • 企业网站建设需要做些什么/如何制作一个自己的网页网站
  • 携程网站用js怎么做/网站模板之家
  • 网站续费自己做/百度如何优化
  • 宁波网站建设模板下载/大地资源网在线观看免费
  • 做网站被骗/网络推广的渠道
  • 帮公司做网站/互联网怎么打广告推广
  • 南昌做网站比较好的公司/广告营销策划方案模板
  • php网站开发什么/品牌推广策略怎么写
  • b2b网站作用/太原seo推广
  • 网站代理浏览器插件/网站seo报告
  • 网站套餐/网络推广违法吗
  • 做网站记者好吗/故事式软文广告300字
  • wordpress uploads/seo也成搜索引擎优化
  • 公司网站主页怎么做/关键词排名零芯互联关键词
  • php做网站访问记录/软文推广300字
  • 云浮市哪有做网站的/公司域名注册步骤
  • 做网站选哪个语言/学seo的培训学校
  • 搞笑幽默网站源码最新/seo关键词优化怎么收费
  • 徐州市网站开发/seo关键词优化软件合作
  • wordpress转入插件/江北seo综合优化外包
  • zblogphp转wordpress/广东seo
  • 公司注册需要准备哪些资料/seo关键词快速提升软件官网
  • 代发网站建设教程/百度ai开放平台
  • 网站开发与设计论文/重庆seo排名外包