Objext完全手册

Objext完全手册

前言

Objext是一个现代js对象模型,它通【访问 www.tangshuang.net 获取更多精彩内容】【本文受版权保护】过丰富的api扩展js原生模型,使一个对【本文受版权保护】【原创内容,转载请注明出处】象拥有更丰富的操作和数据读写能力,同时可【未经授权禁止转载】【关注微信公众号:wwwtangshuangnet】以使之更符合响应式编程的需要。

本文作者:唐霜,转载请注明出处。【本文受版权保护】

之所以开发Objext,一开始是为了解决未经授权,禁止复制转载。本文版权归作者所有,未经授权不得转载。在表单中创建一个可编辑和撤销编辑的对象。【原创不易,请尊重版权】【访问 www.tangshuang.net 获取更多精彩内容】在这个场景中,当一个对象被表单打开时,它本文作者:唐霜,转载请注明出处。【关注微信公众号:wwwtangshuangnet】进入可编辑状态,当提交表单时,它会被更新未经授权,禁止复制转载。本文版权归作者所有,未经授权不得转载。,当放弃提交表单时,它恢复到编辑前的数据【版权所有,侵权必究】【本文首发于唐霜的博客】。在这个原始需求的基础上,我增加,当一个【版权所有】唐霜 www.tangshuang.net【版权所有,侵权必究】属性发生变动时,可以执行某些操作,就像v著作权归作者所有,禁止商业用途转载。未经授权,禁止复制转载。ue可以更新视图一样,通过提供一个$wa【访问 www.tangshuang.net 获取更多精彩内容】【转载请注明来源】tch方法,这种能力被封装的近乎完美。除【关注微信公众号:wwwtangshuangnet】【版权所有】唐霜 www.tangshuang.net了解决属性变动的监听,我还想到表单的校验【原创内容,转载请注明出处】【未经授权禁止转载】问题,提交表单的时候需要对表单数据进行校原创内容,盗版必究。本文版权归作者所有,未经授权不得转载。验。最后,一个包含如下功能的Objext【访问 www.tangshuang.net 获取更多精彩内容】【原创不易,请尊重版权】对象就诞生了:

【原创不易,请尊重版权】【转载请注明来源】著作权归作者所有,禁止商业用途转载。

上述功能,都被集中于Objext对象一体未经授权,禁止复制转载。未经授权,禁止复制转载。,一个看上去像是普通js对象的对象,却可【原创不易,请尊重版权】【原创内容,转载请注明出处】以隐藏上述所有功能。

转载请注明出处:www.tangshua本文作者:唐霜,转载请注明出处。转载请注明出处:www.tangshuang.netng.net【作者:唐霜】转载请注明出处:www.tangshua【版权所有】唐霜 www.tangshuang.net转载请注明出处:www.tangshuang.netng.net

本手册将会介绍上述这些功能如何使用,以及【版权所有】唐霜 www.tangshuang.net本文版权归作者所有,未经授权不得转载。它们背后的实现原理,通过了解这些原理,可本文版权归作者所有,未经授权不得转载。原创内容,盗版必究。以避免一些错误的使用场景。

【原创不易,请尊重版权】【转载请注明来源】

快速上手

本节让你快速使用Objext创建一个对象【原创内容,转载请注明出处】【本文受版权保护】,这个对象几乎和普通的js对象的用法一模【原创不易,请尊重版权】【未经授权禁止转载】一样,只不过你可以监听某个属性的变化。

【转载请注明来源】【作者:唐霜】

安装和使用

objext通过npm进行安装:

【原创不易,请尊重版权】本文版权归作者所有,未经授权不得转载。本文版权归作者所有,未经授权不得转载。【未经授权禁止转载】
npm i objext

安装之后,可以通过不同的方式在项目中引入本文版权归作者所有,未经授权不得转载。本文作者:唐霜,转载请注明出处。

转载请注明出处:www.tangshua【转载请注明来源】【访问 www.tangshuang.net 获取更多精彩内容】ng.net【版权所有,侵权必究】本文版权归作者所有,未经授权不得转载。
// ES6
import Objext from 'objext'

// CommonJS
const { Objext } = require('objext')

浏览器中也可以直接引入使用:

【本文首发于唐霜的博客】本文版权归作者所有,未经授权不得转载。【本文首发于唐霜的博客】【转载请注明来源】
<script src="node_moudules/objext/dist/objext.js"></script>
<script>
const { Objext } = window.objext
</script>

创建实例

创建一个Objext实例超级简单,只需要【原创不易,请尊重版权】本文作者:唐霜,转载请注明出处。传入一个等同结构的js原生对象即可。

转载请注明出处:www.tangshua转载请注明出处:www.tangshuang.net未经授权,禁止复制转载。ng.net本文作者:唐霜,转载请注明出处。【原创内容,转载请注明出处】
const objx = new Objext({
  name: 'susan',
  children: [
    { name: 'tomy', age: 9 },
    { name: 'lily', age: 10 },
  ],
})

这样就创建了一个Objext的实例。它的本文作者:唐霜,转载请注明出处。【原创不易,请尊重版权】使用几乎可以和普通的js对象一样:

【未经授权禁止转载】转载请注明出处:www.tangshua【未经授权禁止转载】【访问 www.tangshuang.net 获取更多精彩内容】ng.net
const child1 = objx.children[0]
child1.age = 10

你可能会问,这有什么意思呢?单纯这样用当【版权所有】唐霜 www.tangshuang.net【访问 www.tangshuang.net 获取更多精彩内容】然没意思,你可以通过$watch方法监听【原创内容,转载请注明出处】【本文受版权保护】某个属性的变化来实现同步更新:

【本文受版权保护】【原创不易,请尊重版权】
objx.$watch('children[0].age', ({ newValue }) => {
  objx.children[1].age = newValue + 1
})

这样可以保持两个孩子的年龄同步增长。这是著作权归作者所有,禁止商业用途转载。本文作者:唐霜,转载请注明出处。一种响应式的方法,你可以试试。还有一种响【原创不易,请尊重版权】原创内容,盗版必究。应式的方法,是“计算属性”,它的用法和j转载请注明出处:www.tangshuang.net本文版权归作者所有,未经授权不得转载。s原生的计算属性一致。

著作权归作者所有,禁止商业用途转载。【原创内容,转载请注明出处】【原创内容,转载请注明出处】
const some = new Objext({
  weight: 120,
  get height() {
    return this.weight + 50
  }, 
})

这样,height就是一个计算属性,它依【关注微信公众号:wwwtangshuangnet】著作权归作者所有,禁止商业用途转载。赖于weight,当weight发生变化转载请注明出处:www.tangshuang.net【版权所有】唐霜 www.tangshuang.net的时候,height也发生变化,但是和原本文版权归作者所有,未经授权不得转载。【原创不易,请尊重版权】生的计算属性相比,objext实例的计算转载请注明出处:www.tangshuang.net【作者:唐霜】属性使用来缓存,当weight发生变化的【未经授权禁止转载】原创内容,盗版必究。时候,缓存被更新,获取height时,直【本文首发于唐霜的博客】【原创不易,请尊重版权】接读取缓存。

【本文受版权保护】【版权所有】唐霜 www.tangshu【版权所有】唐霜 www.tangshuang.net【版权所有,侵权必究】ang.net

这样看来,是不是有点意思了?没关系,我们著作权归作者所有,禁止商业用途转载。【本文首发于唐霜的博客】后面还有更好玩的东西。

【本文首发于唐霜的博客】【未经授权禁止转载】【版权所有】唐霜 www.tangshu【访问 www.tangshuang.net 获取更多精彩内容】【版权所有】唐霜 www.tangshuang.netang.net

基于keyPath的数据操作

keyPath是指获取一个多层级数据节点本文作者:唐霜,转载请注明出处。著作权归作者所有,禁止商业用途转载。的属性链的字符串表达形式,例如obx.b【关注微信公众号:wwwtangshuangnet】【版权所有,侵权必究】ody.hands.left这个属性节点著作权归作者所有,禁止商业用途转载。未经授权,禁止复制转载。,它的keyPath就是’b本文版权归作者所有,未经授权不得转载。本文作者:唐霜,转载请注明出处。ody.hands.left’【关注微信公众号:wwwtangshuangnet】【版权所有】唐霜 www.tangshuang.net;,而在objext中,我们可以使用ke未经授权,禁止复制转载。【访问 www.tangshuang.net 获取更多精彩内容】yPath来获取或更新数据。

【原创内容,转载请注明出处】原创内容,盗版必究。【版权所有,侵权必究】

之所以提供这种方式,是因为,我们直接ob本文版权归作者所有,未经授权不得转载。著作权归作者所有,禁止商业用途转载。x.body.hands.left会遇到【未经授权禁止转载】本文作者:唐霜,转载请注明出处。问题,在某些情况下,这个属性节点并不存在【版权所有】唐霜 www.tangshuang.net转载请注明出处:www.tangshuang.net,比如obx.body根本就不存在,那么本文版权归作者所有,未经授权不得转载。【本文受版权保护】这个操作就会报错,影响程序执行。而通过o【原创内容,转载请注明出处】原创内容,盗版必究。bjext的keyPath进行操作,则不原创内容,盗版必究。【未经授权禁止转载】会影响。

本文版权归作者所有,未经授权不得转载。【未经授权禁止转载】

$get

通过keyPath获取属性节点。

转载请注明出处:www.tangshua原创内容,盗版必究。本文作者:唐霜,转载请注明出处。ng.net【原创内容,转载请注明出处】
const left = objx.$get('body.hands.left')

当body这个属性节点不存在时,直接返回著作权归作者所有,禁止商业用途转载。原创内容,盗版必究。undefined,而不会报错。

【未经授权禁止转载】【版权所有】唐霜 www.tangshu【关注微信公众号:wwwtangshuangnet】【原创内容,转载请注明出处】ang.net转载请注明出处:www.tangshua本文版权归作者所有,未经授权不得转载。【版权所有,侵权必究】ng.net【版权所有】唐霜 www.tangshu本文版权归作者所有,未经授权不得转载。未经授权,禁止复制转载。ang.net

需要注意的是,$get得到的,不是一个数【本文受版权保护】【本文受版权保护】据的原始值,而是objext实例的属性节【原创不易,请尊重版权】【版权所有,侵权必究】点,如果该节点对应的原始数据是一个对象,本文版权归作者所有,未经授权不得转载。著作权归作者所有,禁止商业用途转载。那么这个节点本身将会是一个objext实未经授权,禁止复制转载。本文作者:唐霜,转载请注明出处。例,同时具备了一切objext的特性。这原创内容,盗版必究。【关注微信公众号:wwwtangshuangnet】涉及到objext的内部层级问题,后文会【版权所有,侵权必究】【转载请注明来源】更深入的讲解。

本文作者:唐霜,转载请注明出处。著作权归作者所有,禁止商业用途转载。

另外,如果你直接在objext实例上添加【未经授权禁止转载】【本文首发于唐霜的博客】一个属性,例如 objx.age = 1【版权所有】唐霜 www.tangshuang.net【版权所有】唐霜 www.tangshuang.net0 这种,$get是获取不到这种属性的。本文版权归作者所有,未经授权不得转载。【作者:唐霜】这是一个比较忌讳的做法,因此,一定要记住转载请注明出处:www.tangshuang.net【关注微信公众号:wwwtangshuangnet】,永远不要直接在objext实例对象上添本文作者:唐霜,转载请注明出处。本文版权归作者所有,未经授权不得转载。加属性,也不要用delete操作符直接删【本文受版权保护】本文版权归作者所有,未经授权不得转载。除属性,而要使用objext的实例方法$【原创内容,转载请注明出处】【版权所有,侵权必究】set和$remove。

【关注微信公众号:wwwtangshua本文版权归作者所有,未经授权不得转载。【版权所有,侵权必究】ngnet】本文版权归作者所有,未经授权不得转载。

$set

通过keyPath更新或添加一个属性节点【版权所有,侵权必究】【关注微信公众号:wwwtangshuangnet】

【未经授权禁止转载】未经授权,禁止复制转载。转载请注明出处:www.tangshua本文版权归作者所有,未经授权不得转载。原创内容,盗版必究。ng.net原创内容,盗版必究。
objx.$set('body.hands.left', true')

当节点不存在时,这个节点会被添加。即使b【版权所有,侵权必究】【作者:唐霜】ody这个节点不存在,body, han【作者:唐霜】【未经授权禁止转载】ds, left都会被逐一添加,这样可以原创内容,盗版必究。原创内容,盗版必究。保证开发者真正的目的实现,而且还不会报错【作者:唐霜】【版权所有,侵权必究】

【关注微信公众号:wwwtangshua著作权归作者所有,禁止商业用途转载。本文作者:唐霜,转载请注明出处。ngnet】【原创内容,转载请注明出处】本文作者:唐霜,转载请注明出处。【版权所有】唐霜 www.tangshu转载请注明出处:www.tangshuang.net【本文首发于唐霜的博客】ang.net

objext的特点是响应式的,可以通过$【未经授权禁止转载】本文版权归作者所有,未经授权不得转载。watch对属性的变化进行响应。当你使用【原创不易,请尊重版权】【本文首发于唐霜的博客】$set进行数据更改或添加时,对应的wa本文作者:唐霜,转载请注明出处。【未经授权禁止转载】tcher会被触发。注意,添加数据也会触【原创不易,请尊重版权】转载请注明出处:www.tangshuang.net发watcher哦。

本文版权归作者所有,未经授权不得转载。【本文受版权保护】未经授权,禁止复制转载。

注意:不要直接在objext实例上添加一转载请注明出处:www.tangshuang.net转载请注明出处:www.tangshuang.net个新属性,而要使用$set添加。这样做有【关注微信公众号:wwwtangshuangnet】【未经授权禁止转载】两个原因:

【转载请注明来源】【版权所有】唐霜 www.tangshu【未经授权禁止转载】【版权所有,侵权必究】ang.net【原创不易,请尊重版权】

1.直接添加属性不具备响应式,即使wat【访问 www.tangshuang.net 获取更多精彩内容】著作权归作者所有,禁止商业用途转载。ch,也不会响应;2.直接添加的属性,在【本文首发于唐霜的博客】本文作者:唐霜,转载请注明出处。使用$put时,会被删掉,因为它不存在于转载请注明出处:www.tangshuang.net本文作者:唐霜,转载请注明出处。内部的记录中。

【关注微信公众号:wwwtangshua本文作者:唐霜,转载请注明出处。未经授权,禁止复制转载。ngnet】【版权所有,侵权必究】【作者:唐霜】

那如果要添加一个不是响应式的,但是又不会原创内容,盗版必究。【版权所有,侵权必究】被删掉的属性怎么办呢?需要用到后面的$d【转载请注明来源】【未经授权禁止转载】efine,后文会详细介绍。

【转载请注明来源】【转载请注明来源】本文作者:唐霜,转载请注明出处。

而另外一种情况是,如果你想在单个操作中,【原创内容,转载请注明出处】【作者:唐霜】仅仅更新属性值,而不触发watcher怎【本文首发于唐霜的博客】原创内容,盗版必究。么办呢?$set的第三个参数设置为fal【关注微信公众号:wwwtangshuangnet】【作者:唐霜】se即可:

【版权所有,侵权必究】未经授权,禁止复制转载。【版权所有】唐霜 www.tangshu【版权所有】唐霜 www.tangshuang.net原创内容,盗版必究。ang.net
objx.$set('body.hands.left', true, false)

这样就不会触发通过$watch绑定的wa【关注微信公众号:wwwtangshuangnet】【版权所有,侵权必究】tcher。

【原创不易,请尊重版权】【未经授权禁止转载】【本文受版权保护】

$has

判断是否存在一个属性节点。

原创内容,盗版必究。未经授权,禁止复制转载。
if (objx.$has('body.hands')) {
  // ...
}

需要注意的是,如果这个属性是直接通过js本文作者:唐霜,转载请注明出处。原创内容,盗版必究。原生的属性赋值的方式添加上去的,那么$h【版权所有,侵权必究】【转载请注明来源】as也是判断不到的,会返回fasle,这未经授权,禁止复制转载。【访问 www.tangshuang.net 获取更多精彩内容】和$get的道理是一样的。

【关注微信公众号:wwwtangshua【版权所有】唐霜 www.tangshuang.net著作权归作者所有,禁止商业用途转载。ngnet】【版权所有】唐霜 www.tangshu原创内容,盗版必究。【未经授权禁止转载】ang.net

$update

批量更新/添加属性节点。

原创内容,盗版必究。转载请注明出处:www.tangshua【原创不易,请尊重版权】本文版权归作者所有,未经授权不得转载。ng.net未经授权,禁止复制转载。
objx.$update({
  name: 'susan',
  age: 34,
})

通过这种方式可以一次性写入多个属性。当一【版权所有】唐霜 www.tangshuang.net【未经授权禁止转载】个属性不存在时,会自动创建该属性。

【访问 www.tangshuang.n【原创内容,转载请注明出处】【本文首发于唐霜的博客】et 获取更多精彩内容】【未经授权禁止转载】未经授权,禁止复制转载。【本文受版权保护】

使用$update的好处是批量。这听上去转载请注明出处:www.tangshuang.net【访问 www.tangshuang.net 获取更多精彩内容】是废话,但是并不是,普通$set一个一个【本文首发于唐霜的博客】未经授权,禁止复制转载。更新属性,不仅写法上比较麻烦,而且每一次原创内容,盗版必究。原创内容,盗版必究。$set都会触发watcher去执行,这【版权所有】唐霜 www.tangshuang.net【访问 www.tangshuang.net 获取更多精彩内容】会影响后面的$set的值。但是$upda未经授权,禁止复制转载。转载请注明出处:www.tangshuang.nette会在一次更新完之后,才会去执行所有涉【未经授权禁止转载】未经授权,禁止复制转载。及到的所有watcher。这就可能出现比【版权所有,侵权必究】著作权归作者所有,禁止商业用途转载。较有趣的现象,当你使用一组$set和使用【未经授权禁止转载】未经授权,禁止复制转载。$update的时候,虽然他们都是更新相本文作者:唐霜,转载请注明出处。【版权所有,侵权必究】同的一批数据,但是有可能执行完毕之后,整转载请注明出处:www.tangshuang.net【转载请注明来源】个objx的值不同,这是因为watche本文作者:唐霜,转载请注明出处。【访问 www.tangshuang.net 获取更多精彩内容】r的执行顺序可能不同导致的。因此,在使用转载请注明出处:www.tangshuang.net【版权所有,侵权必究】的时候,你需要注意。

【版权所有】唐霜 www.tangshu未经授权,禁止复制转载。未经授权,禁止复制转载。ang.net【本文受版权保护】转载请注明出处:www.tangshua【版权所有】唐霜 www.tangshuang.net【关注微信公众号:wwwtangshuangnet】ng.net【原创不易,请尊重版权】

$put

重置整个objext实例的数据为传入的新【原创内容,转载请注明出处】【本文受版权保护】数据,之前的所有数据会被清空。

转载请注明出处:www.tangshua【原创不易,请尊重版权】【版权所有】唐霜 www.tangshuang.netng.net【访问 www.tangshuang.n【本文首发于唐霜的博客】【未经授权禁止转载】et 获取更多精彩内容】【访问 www.tangshuang.n本文作者:唐霜,转载请注明出处。未经授权,禁止复制转载。et 获取更多精彩内容】【转载请注明来源】

看上去$update和$put很像,但实【未经授权禁止转载】著作权归作者所有,禁止商业用途转载。际上,完全不同,$update简单理解是著作权归作者所有,禁止商业用途转载。【访问 www.tangshuang.net 获取更多精彩内容】多个$set同时执行,而$put则是现$著作权归作者所有,禁止商业用途转载。本文版权归作者所有,未经授权不得转载。remove所有已经存在的数据,然后在$未经授权,禁止复制转载。著作权归作者所有,禁止商业用途转载。set给的数据。

【版权所有,侵权必究】本文版权归作者所有,未经授权不得转载。【转载请注明来源】原创内容,盗版必究。

在删除阶段,objext实例上所有的属性【关注微信公众号:wwwtangshuangnet】【关注微信公众号:wwwtangshuangnet】都会被删除,这也就是为什么不能通过js原【本文首发于唐霜的博客】【本文首发于唐霜的博客】生赋值的形式新增属性的原因之一。

本文作者:唐霜,转载请注明出处。本文版权归作者所有,未经授权不得转载。
const age = objx.$get('age')
objx.$put({
  name: 'susan',
})

上面这段代码执行之后,age没有了,因此著作权归作者所有,禁止商业用途转载。著作权归作者所有,禁止商业用途转载。要提前把age取出来。

本文版权归作者所有,未经授权不得转载。【版权所有】唐霜 www.tangshu【版权所有】唐霜 www.tangshuang.net【版权所有】唐霜 www.tangshuang.netang.net

$remove

从objext实例上删除一个属性。

【本文受版权保护】【原创不易,请尊重版权】
objx.$remove('body.hands')

有人可能会问,移除直接delete不就行【访问 www.tangshuang.net 获取更多精彩内容】未经授权,禁止复制转载。了嘛。听上去很简单,实际上,在objex本文版权归作者所有,未经授权不得转载。【关注微信公众号:wwwtangshuangnet】t内部存在依赖关系,如果一个属性依赖另外原创内容,盗版必究。转载请注明出处:www.tangshuang.net一个属性,那么当被依赖的属性被移除时,应【版权所有,侵权必究】【本文受版权保护】该解除这种依赖关系。单纯delete做不【版权所有】唐霜 www.tangshuang.net【版权所有】唐霜 www.tangshuang.net到,因此,必须使用$remove来移除所未经授权,禁止复制转载。未经授权,禁止复制转载。有你需要移除的属性。

【版权所有】唐霜 www.tangshu【关注微信公众号:wwwtangshuangnet】【访问 www.tangshuang.net 获取更多精彩内容】ang.net【未经授权禁止转载】

响应式

Objext的一个特征是完全的响应式,它【版权所有】唐霜 www.tangshuang.net【原创不易,请尊重版权】可以塑造多种响应式方式,而且脱离了任何业【本文首发于唐霜的博客】转载请注明出处:www.tangshuang.net务场景,是一个纯粹的对象响应式的库。它不本文版权归作者所有,未经授权不得转载。【作者:唐霜】考虑界面响应的问题,它可以用来解决任何需【访问 www.tangshuang.net 获取更多精彩内容】【访问 www.tangshuang.net 获取更多精彩内容】要观察数据变化而跟随变化的场景,虽然需要【本文首发于唐霜的博客】【访问 www.tangshuang.net 获取更多精彩内容】自己编写被响应的代码。

本文版权归作者所有,未经授权不得转载。【原创不易,请尊重版权】【版权所有】唐霜 www.tangshu著作权归作者所有,禁止商业用途转载。【原创内容,转载请注明出处】ang.net

计算属性

计算属性被大规模应用是vue出现的时候,【版权所有,侵权必究】转载请注明出处:www.tangshuang.net在vue中,我们需要将普通的数据和计算属【关注微信公众号:wwwtangshuangnet】【关注微信公众号:wwwtangshuangnet】性数据分开写,这不是没有道理的,因为计算本文作者:唐霜,转载请注明出处。未经授权,禁止复制转载。属性意味着不可以手动去修改它的值。在ob【关注微信公众号:wwwtangshuangnet】【作者:唐霜】jext中也是一样的,如果一个属性是计算【访问 www.tangshuang.net 获取更多精彩内容】【原创内容,转载请注明出处】属性,就不能通过$set或者赋值的方式去【原创内容,转载请注明出处】【版权所有,侵权必究】修改它的值。

【访问 www.tangshuang.n【本文首发于唐霜的博客】【版权所有,侵权必究】et 获取更多精彩内容】【原创内容,转载请注明出处】转载请注明出处:www.tangshua【未经授权禁止转载】【转载请注明来源】ng.net

所以,到底应该怎么使用计算属性呢?

【转载请注明来源】【未经授权禁止转载】【未经授权禁止转载】

创建计算属性

【本文受版权保护】转载请注明出处:www.tangshua著作权归作者所有,禁止商业用途转载。【原创不易,请尊重版权】ng.net【关注微信公众号:wwwtangshua【本文首发于唐霜的博客】【本文首发于唐霜的博客】ngnet】【作者:唐霜】

创建计算属性超级简单:

本文作者:唐霜,转载请注明出处。【版权所有】唐霜 www.tangshu转载请注明出处:www.tangshuang.net【原创内容,转载请注明出处】ang.net本文版权归作者所有,未经授权不得转载。原创内容,盗版必究。
const objx = new Objext({
  age: 10, 
  get weight() {
    return age * 10
  }, 
})

就像js原生对象的getter一样。但是本文版权归作者所有,未经授权不得转载。转载请注明出处:www.tangshuang.net需要注意的是,如果你还设置了一个sett本文作者:唐霜,转载请注明出处。【作者:唐霜】er,那setter会被直接忽略,你不可转载请注明出处:www.tangshuang.net【版权所有,侵权必究】以在objext中使用setter,se本文作者:唐霜,转载请注明出处。【未经授权禁止转载】tter应该被$watch替代。

著作权归作者所有,禁止商业用途转载。【原创不易,请尊重版权】【本文首发于唐霜的博客】

使用计算属性

著作权归作者所有,禁止商业用途转载。本文作者:唐霜,转载请注明出处。

使用计算属性和其他普通属性是一模一样的,原创内容,盗版必究。【原创内容,转载请注明出处】不同之处在于,计算属性本身会根据所依赖的转载请注明出处:www.tangshuang.net著作权归作者所有,禁止商业用途转载。属性的变化自动变化。

【未经授权禁止转载】【访问 www.tangshuang.n【未经授权禁止转载】【版权所有,侵权必究】et 获取更多精彩内容】未经授权,禁止复制转载。原创内容,盗版必究。
console.log(objx.weight) // 100
objx.age = 11
console.log(objx.weight) // 110

和普通的对象不同的是,当对属性赋值时,o著作权归作者所有,禁止商业用途转载。【本文首发于唐霜的博客】bjext实例内部是响应式的,赋值时会自原创内容,盗版必究。著作权归作者所有,禁止商业用途转载。动更新计算属性的缓存,因此,在修改属性值本文版权归作者所有,未经授权不得转载。本文版权归作者所有,未经授权不得转载。之后,依赖它的其他属性值也就跟着变化了。

【版权所有】唐霜 www.tangshu未经授权,禁止复制转载。【本文首发于唐霜的博客】ang.net【访问 www.tangshuang.n【本文首发于唐霜的博客】【本文受版权保护】et 获取更多精彩内容】【版权所有】唐霜 www.tangshu原创内容,盗版必究。【原创不易,请尊重版权】ang.net

计算器中的this

【本文受版权保护】【版权所有】唐霜 www.tangshu本文作者:唐霜,转载请注明出处。本文版权归作者所有,未经授权不得转载。ang.net【原创内容,转载请注明出处】【作者:唐霜】

计算器是指创建计算属性时,给的计算函数。转载请注明出处:www.tangshuang.net著作权归作者所有,禁止商业用途转载。计算函数可以是含有this的作用域函数。转载请注明出处:www.tangshuang.net【原创不易,请尊重版权】这个this,在正常情况下代表当前所在的【转载请注明来源】【转载请注明来源】objext对象,例如:

【原创内容,转载请注明出处】【未经授权禁止转载】原创内容,盗版必究。
const objx = new Objext({
  age: 10,
  get weight() {
    return this.age * 10
  },
})

weight计算器中的this指代的就是【版权所有,侵权必究】转载请注明出处:www.tangshuang.netobjx。但是,在一些情况下,这个thi【本文首发于唐霜的博客】【访问 www.tangshuang.net 获取更多精彩内容】s可以被bind到其他objext对象上【本文首发于唐霜的博客】【转载请注明来源】

【版权所有】唐霜 www.tangshu转载请注明出处:www.tangshuang.net本文作者:唐霜,转载请注明出处。ang.net【转载请注明来源】
const objx2 = new Objext({
  age: 20,
})
objx.$bind(objx2)

使用$bind方法,使objx的weig【本文首发于唐霜的博客】【原创内容,转载请注明出处】ht计算器中的this换绑到objx2上转载请注明出处:www.tangshuang.net未经授权,禁止复制转载。面,这样,当objx2.age发生变化的【转载请注明来源】【本文受版权保护】时候,objx.weight就会自动更新【版权所有】唐霜 www.tangshuang.net【本文受版权保护】。但是,需要注意的是,$bind方法会使【作者:唐霜】【访问 www.tangshuang.net 获取更多精彩内容】所有的计算器的this都换绑,而不是只换本文版权归作者所有,未经授权不得转载。【原创内容,转载请注明出处】绑一个计算器。因此,在使用$bind时,【访问 www.tangshuang.net 获取更多精彩内容】著作权归作者所有,禁止商业用途转载。也要理解它的运作规律才使用。

未经授权,禁止复制转载。【版权所有】唐霜 www.tangshu【版权所有】唐霜 www.tangshuang.net未经授权,禁止复制转载。ang.net

当一个计算属性依赖另外一个objext对【未经授权禁止转载】【未经授权禁止转载】象的某个属性时,可以使用$depend方【版权所有】唐霜 www.tangshuang.net【转载请注明来源】法创建这种依赖关系:

著作权归作者所有,禁止商业用途转载。【转载请注明来源】【本文受版权保护】【版权所有】唐霜 www.tangshu【关注微信公众号:wwwtangshuangnet】【转载请注明来源】ang.net
const objx = new Objext({
  get weight() {
    return objx2.age * 10 // 依赖objx2的age属性
  },
})

这里,objx依赖objx2.age,o【版权所有】唐霜 www.tangshuang.net【访问 www.tangshuang.net 获取更多精彩内容】bjx2也是一个objext对象,但是o转载请注明出处:www.tangshuang.net【版权所有】唐霜 www.tangshuang.netbjx2的age属性发生变化的时候,并不【原创不易,请尊重版权】【版权所有,侵权必究】能直接触发objx的weight发生变化【原创内容,转载请注明出处】【访问 www.tangshuang.net 获取更多精彩内容】,为了解决这个问题,你需要使用$depe转载请注明出处:www.tangshuang.net【原创内容,转载请注明出处】nd方法:

本文版权归作者所有,未经授权不得转载。本文作者:唐霜,转载请注明出处。
objx.$depend(objx)

这需要你手动调用,而不能靠objext自【访问 www.tangshuang.net 获取更多精彩内容】【版权所有】唐霜 www.tangshuang.net动实现。

【转载请注明来源】【未经授权禁止转载】

$watch

$watch方法为objext实例提供一【未经授权禁止转载】【版权所有,侵权必究】个观察者,对特定keyPath的属性进行原创内容,盗版必究。【本文首发于唐霜的博客】观察,当该属性发生变化时,执行传入的回调原创内容,盗版必究。【本文受版权保护】函数。它的使用非常像angular的$w本文版权归作者所有,未经授权不得转载。原创内容,盗版必究。atch方法。

【原创内容,转载请注明出处】【转载请注明来源】
objx.$watch('body.hands.left', ({ newValue }) => {
  console.log(newValue)
})

$watch方法是实现objext内部响【转载请注明来源】本文版权归作者所有,未经授权不得转载。应式功能的基础方法,因此,它会被广泛用到【转载请注明来源】【作者:唐霜】,包括objext内部的响应式实现方式,未经授权,禁止复制转载。【原创内容,转载请注明出处】例如计算属性的自动更新。

【原创内容,转载请注明出处】【本文首发于唐霜的博客】【本文首发于唐霜的博客】【作者:唐霜】

回调函数fn的参数包括:

原创内容,盗版必究。转载请注明出处:www.tangshua【关注微信公众号:wwwtangshuangnet】转载请注明出处:www.tangshuang.netng.net本文版权归作者所有,未经授权不得转载。【版权所有】唐霜 www.tangshu著作权归作者所有,禁止商业用途转载。转载请注明出处:www.tangshuang.netang.net

其中e,也就是第一个参数,会包含如下信息转载请注明出处:www.tangshuang.net【本文首发于唐霜的博客】

【转载请注明来源】【本文受版权保护】本文作者:唐霜,转载请注明出处。转载请注明出处:www.tangshua【作者:唐霜】【原创内容,转载请注明出处】ng.net

stopPropagation

本文版权归作者所有,未经授权不得转载。原创内容,盗版必究。【访问 www.tangshuang.n原创内容,盗版必究。转载请注明出处:www.tangshuang.netet 获取更多精彩内容】本文版权归作者所有,未经授权不得转载。

objext的$watch的第三个参数d本文作者:唐霜,转载请注明出处。未经授权,禁止复制转载。eep让你可以对一个本身是对象的属性进行【本文受版权保护】【访问 www.tangshuang.net 获取更多精彩内容】深度观察。当深层次的节点发生变化的时候,【未经授权禁止转载】【本文首发于唐霜的博客】代表着被观察的节点也发生了变化。它的内部【原创不易,请尊重版权】原创内容,盗版必究。实现机理和DOM的事件冒泡一样,一层一层未经授权,禁止复制转载。【转载请注明来源】向上传递,触发对应的回调函数。但是,如果未经授权,禁止复制转载。转载请注明出处:www.tangshuang.net你在向上冒泡的过程中,调用了stopPr转载请注明出处:www.tangshuang.net著作权归作者所有,禁止商业用途转载。opagation方法的话,冒泡就会停止【访问 www.tangshuang.net 获取更多精彩内容】【原创不易,请尊重版权】,向上的后续回调函数就不会执行了。例如:

【关注微信公众号:wwwtangshua【本文受版权保护】本文作者:唐霜,转载请注明出处。ngnet】未经授权,禁止复制转载。
objx.$watch('body.hands', ({ newValue }) => {
  console.log(newValue)
}, true)
objx.$watch('body.hands.left', ({ newValue, stopPropagation }) => {
  if (newValue === true) {
    stopPropagation()
  }
})

上面这段代码中,如果body.hands本文作者:唐霜,转载请注明出处。【本文受版权保护】.left被设置为true,那么第一个$本文作者:唐霜,转载请注明出处。【未经授权禁止转载】watch的回调函数不会被触发。

【版权所有】唐霜 www.tangshu转载请注明出处:www.tangshuang.net著作权归作者所有,禁止商业用途转载。ang.net【关注微信公众号:wwwtangshua【访问 www.tangshuang.net 获取更多精彩内容】【本文首发于唐霜的博客】ngnet】

preventDefault

未经授权,禁止复制转载。著作权归作者所有,禁止商业用途转载。著作权归作者所有,禁止商业用途转载。【访问 www.tangshuang.n本文作者:唐霜,转载请注明出处。【作者:唐霜】et 获取更多精彩内容】

而preventDefault方法也和D【版权所有】唐霜 www.tangshuang.net【本文受版权保护】OM事件中的preventDefault原创内容,盗版必究。著作权归作者所有,禁止商业用途转载。一致,它会阻止剩下的其他回调函数被执行:

未经授权,禁止复制转载。【版权所有】唐霜 www.tangshu【版权所有】唐霜 www.tangshuang.net【访问 www.tangshuang.net 获取更多精彩内容】ang.net【关注微信公众号:wwwtangshua著作权归作者所有,禁止商业用途转载。本文作者:唐霜,转载请注明出处。ngnet】【关注微信公众号:wwwtangshua转载请注明出处:www.tangshuang.net【本文首发于唐霜的博客】ngnet】
objx.$watch('body.hands.left', ({ newValue, preventDefault }) => {
  if (newValue === true) {
    preventDefault()
  }
})
objx.$watch('body.hands.left', (e, newValue) => {
  console.log(newValue)
})

上面的代码中,如果body.hands.未经授权,禁止复制转载。著作权归作者所有,禁止商业用途转载。left为true,那么第二个回调函数就本文版权归作者所有,未经授权不得转载。本文作者:唐霜,转载请注明出处。不会被执行了。

原创内容,盗版必究。【转载请注明来源】著作权归作者所有,禁止商业用途转载。【版权所有,侵权必究】

特殊符号

著作权归作者所有,禁止商业用途转载。【版权所有】唐霜 www.tangshu【本文受版权保护】【转载请注明来源】ang.net原创内容,盗版必究。

特殊符号*表示对所有的变化进行观察:

【原创内容,转载请注明出处】著作权归作者所有,禁止商业用途转载。本文作者:唐霜,转载请注明出处。本文作者:唐霜,转载请注明出处。
objx.$watch('*', ({ path, match }) => {
  console.log('观察' + match)
  console.log('发生变化的是' + path)
})

$unwatch

$unwatch是$watch的反函数,未经授权,禁止复制转载。本文作者:唐霜,转载请注明出处。用于对某个观察者进行解绑,解绑之后回调函【作者:唐霜】【未经授权禁止转载】数就不会被调用了。

【访问 www.tangshuang.n【版权所有,侵权必究】本文作者:唐霜,转载请注明出处。et 获取更多精彩内容】著作权归作者所有,禁止商业用途转载。
objx.$watch('body', callback)
// ...
objx.$unwatch('body', callback)

$silent

是否开启安静模式更新数据,当安静模式开启【未经授权禁止转载】未经授权,禁止复制转载。后,所有对数据的修改都不会触发watch原创内容,盗版必究。【未经授权禁止转载】er。

【本文受版权保护】【作者:唐霜】

$isSilent

判断是否处于安静模式中。

【本文首发于唐霜的博客】【版权所有,侵权必究】【本文受版权保护】

数据版本控制

Objext对象的一个特点是可以随意的修著作权归作者所有,禁止商业用途转载。原创内容,盗版必究。改和恢复数据,特别是在一些编辑的时候,你未经授权,禁止复制转载。【本文首发于唐霜的博客】可以提供临时保存和恢复的能力。当你放弃进【本文首发于唐霜的博客】【未经授权禁止转载】行编辑的时候,一个方法就可以让数据恢复到【转载请注明来源】原创内容,盗版必究。编辑之初的状态。

著作权归作者所有,禁止商业用途转载。【关注微信公众号:wwwtangshua未经授权,禁止复制转载。【关注微信公众号:wwwtangshuangnet】ngnet】【未经授权禁止转载】

$commit

创建一个名为tag的快照。

【版权所有】唐霜 www.tangshu【作者:唐霜】本文版权归作者所有,未经授权不得转载。ang.net【转载请注明来源】【本文首发于唐霜的博客】【版权所有】唐霜 www.tangshu【版权所有】唐霜 www.tangshuang.net本文作者:唐霜,转载请注明出处。ang.net
objx.$commit('tag1')

打完一个tag之后,会在内部保存当时的所本文作者:唐霜,转载请注明出处。本文版权归作者所有,未经授权不得转载。有数据,并建立一个快照,后续对objex【作者:唐霜】【作者:唐霜】t对象的修改,不会影响快照内容。

转载请注明出处:www.tangshua【本文受版权保护】【原创不易,请尊重版权】ng.net著作权归作者所有,禁止商业用途转载。转载请注明出处:www.tangshua【版权所有】唐霜 www.tangshuang.net【本文受版权保护】ng.net【关注微信公众号:wwwtangshua【转载请注明来源】【转载请注明来源】ngnet】

不能存在同名快照,如果已经存在了同名快照【访问 www.tangshuang.net 获取更多精彩内容】未经授权,禁止复制转载。,会被新快照覆盖。

原创内容,盗版必究。原创内容,盗版必究。

$reset

恢复到名为tag的快照的数据。

【关注微信公众号:wwwtangshua【访问 www.tangshuang.net 获取更多精彩内容】本文版权归作者所有,未经授权不得转载。ngnet】著作权归作者所有,禁止商业用途转载。
objx.name = 'tomy'
objx.$commit('version1')
objx.name = 'jimy'
objx.$reset('version1')
console.log(objx.name) // => 'tomy'

reset之后名为tag的快照还是存在的【原创不易,请尊重版权】【访问 www.tangshuang.net 获取更多精彩内容】,只是当前的数据被设置为快照的内容。

原创内容,盗版必究。【本文首发于唐霜的博客】本文作者:唐霜,转载请注明出处。

$revert

删除名为tag的快照。

未经授权,禁止复制转载。未经授权,禁止复制转载。
objx.name = 'tomy'
objx.$commit('version1')
objx.name = 'jimy'
objx.$commit('version2')
objx.name = 'gofei'
objx.$revert() // 删除version2
objx.$reset() // 恢复到version1
console.log(objx.name) // => 'tomy'

数据锁

在一些情况下,我们可以锁死objext实原创内容,盗版必究。【原创内容,转载请注明出处】例,使它不能进行任何修改。

本文版权归作者所有,未经授权不得转载。著作权归作者所有,禁止商业用途转载。

$lock

锁死数据。

【原创内容,转载请注明出处】未经授权,禁止复制转载。本文版权归作者所有,未经授权不得转载。
objx.name = 'digou'
objx.$lock()
objx.name = 'ximeon'
console.log(objx.name) // digou

锁死后,属性不能被修改。

本文版权归作者所有,未经授权不得转载。【未经授权禁止转载】

objext具有继承性,父级属性锁死后,【版权所有】唐霜 www.tangshuang.net著作权归作者所有,禁止商业用途转载。子属性也不能修改。

【本文首发于唐霜的博客】本文作者:唐霜,转载请注明出处。【转载请注明来源】本文作者:唐霜,转载请注明出处。
objx.body.$lock()
objx.body.hands.left = true // 无法进行修改

$unlock

解锁数据,使返回可修改状态。

【未经授权禁止转载】著作权归作者所有,禁止商业用途转载。

$isLocked

判断是否被锁死。

【访问 www.tangshuang.n本文作者:唐霜,转载请注明出处。未经授权,禁止复制转载。et 获取更多精彩内容】本文版权归作者所有,未经授权不得转载。

数据校验

objext支持对数据进行校验,校验的时【版权所有,侵权必究】【关注微信公众号:wwwtangshuangnet】间点有两种:1.修改数据时;2.调用$v原创内容,盗版必究。【本文受版权保护】alidate方法一次性全部校验。

本文作者:唐霜,转载请注明出处。【未经授权禁止转载】【原创内容,转载请注明出处】

$formulate

设置校验规则。

著作权归作者所有,禁止商业用途转载。【原创不易,请尊重版权】本文作者:唐霜,转载请注明出处。
objx.$formulate({
  path: 'body.hands.left',
  validate: value => typeof value === 'boolean',
  message: '必须为true/false',
  warn: error => window.toast(error.message),
})
objx.$strict()
objx.body.hands.left = 'true' // 报错

determine, validate,【未经授权禁止转载】【作者:唐霜】 warn中都可以使用this,指向当前【本文首发于唐霜的博客】【关注微信公众号:wwwtangshuangnet】context,当前context通过$【转载请注明来源】本文作者:唐霜,转载请注明出处。bind方法绑定,没有绑定时,表示obj【作者:唐霜】【未经授权禁止转载】ext对象自身。

【版权所有】唐霜 www.tangshu本文作者:唐霜,转载请注明出处。未经授权,禁止复制转载。ang.net本文作者:唐霜,转载请注明出处。未经授权,禁止复制转载。【访问 www.tangshuang.n未经授权,禁止复制转载。本文作者:唐霜,转载请注明出处。et 获取更多精彩内容】

$validate

执行校验器。

【原创内容,转载请注明出处】原创内容,盗版必究。

其中,nextData表示提前进行校验,【访问 www.tangshuang.net 获取更多精彩内容】本文作者:唐霜,转载请注明出处。比如,你准备要对某个keyPath进行设【关注微信公众号:wwwtangshuangnet】未经授权,禁止复制转载。置新值时,可以提前通过nextData来本文作者:唐霜,转载请注明出处。【作者:唐霜】校验一下,看看是否符合校验规则。

【访问 www.tangshuang.n未经授权,禁止复制转载。本文作者:唐霜,转载请注明出处。et 获取更多精彩内容】【作者:唐霜】【关注微信公众号:wwwtangshua原创内容,盗版必究。【版权所有】唐霜 www.tangshuang.netngnet】本文作者:唐霜,转载请注明出处。
objx.$validate('name', 'Timy')

$strict

切换严格模式。严格模式下,修改属性值也会【本文首发于唐霜的博客】【版权所有】唐霜 www.tangshuang.net进行校验。默认情况下,严格模式是关闭的。【版权所有】唐霜 www.tangshuang.net本文版权归作者所有,未经授权不得转载。在前面的代码中已经有演示,这里不赘述。

本文版权归作者所有,未经授权不得转载。【版权所有,侵权必究】著作权归作者所有,禁止商业用途转载。

和$silent很像,也具有继承性。

【访问 www.tangshuang.n本文作者:唐霜,转载请注明出处。【原创内容,转载请注明出处】et 获取更多精彩内容】【版权所有,侵权必究】【版权所有,侵权必究】未经授权,禁止复制转载。

$isStrict

判断是否处于严格模式下。

本文作者:唐霜,转载请注明出处。【原创内容,转载请注明出处】【未经授权禁止转载】

高级用法

除了以上已经列出的接口和功能,objex本文版权归作者所有,未经授权不得转载。本文作者:唐霜,转载请注明出处。t还有一些高级用法,使用使会费些脑子,但转载请注明出处:www.tangshuang.net著作权归作者所有,禁止商业用途转载。是在一些特定场合下可以帮助你实现一些特殊著作权归作者所有,禁止商业用途转载。【关注微信公众号:wwwtangshuangnet】的要求。

【版权所有】唐霜 www.tangshu未经授权,禁止复制转载。【访问 www.tangshuang.net 获取更多精彩内容】ang.net原创内容,盗版必究。

批量更新

我们可能会一次性更新多个值,普通模式下,著作权归作者所有,禁止商业用途转载。本文作者:唐霜,转载请注明出处。每一次更新,都会触发watcher,一次【作者:唐霜】原创内容,盗版必究。watcher执行,可能带来不同的结果,【原创内容,转载请注明出处】【作者:唐霜】特别是有依赖性时。一般来讲,我们使用$u【本文受版权保护】转载请注明出处:www.tangshuang.netpdate进行批量更新,但是,你也可以自转载请注明出处:www.tangshuang.net【访问 www.tangshuang.net 获取更多精彩内容】己构造批量更新。

【版权所有,侵权必究】著作权归作者所有,禁止商业用途转载。【作者:唐霜】未经授权,禁止复制转载。

$start

开启批量更新模式,开启后,watcher【转载请注明来源】【版权所有】唐霜 www.tangshuang.net不会被触发,直到调用$end。

【本文首发于唐霜的博客】本文版权归作者所有,未经授权不得转载。

$end

完成批量更新,关闭批量更新模式,并且触发本文版权归作者所有,未经授权不得转载。【版权所有】唐霜 www.tangshuang.net涉及到的所有watcher。

【本文受版权保护】【版权所有】唐霜 www.tangshu【版权所有,侵权必究】【作者:唐霜】ang.net【版权所有】唐霜 www.tangshu【版权所有】唐霜 www.tangshuang.net本文作者:唐霜,转载请注明出处。ang.net
objx.$start()
objx.name = 'tom'
objx.age = 10
objx.name ='tomi'
objx.$end()

上面的代码中,我们执行了两次objx.n【本文受版权保护】【作者:唐霜】ame赋值操作,但是由于处于批量更新模式【关注微信公众号:wwwtangshuangnet】【版权所有】唐霜 www.tangshuang.net中,最终objx.name的watche【原创内容,转载请注明出处】【转载请注明来源】r只会被触发一次。

【转载请注明来源】原创内容,盗版必究。【未经授权禁止转载】【本文受版权保护】

实例依赖

普通对象中的this仅会指向自身,但是由【本文首发于唐霜的博客】本文作者:唐霜,转载请注明出处。于objext具备响应式能力,因此,有更本文作者:唐霜,转载请注明出处。【转载请注明来源】丰富的依赖接口。例如objx1依赖obj【本文受版权保护】【访问 www.tangshuang.net 获取更多精彩内容】x2,那么当objx2中的某个发生变化时转载请注明出处:www.tangshuang.net【版权所有】唐霜 www.tangshuang.net,objx1对应的属性也应该发生变化。

【作者:唐霜】【版权所有,侵权必究】【版权所有,侵权必究】

$depend

跨实例的属性依赖。

【版权所有】唐霜 www.tangshu本文版权归作者所有,未经授权不得转载。【作者:唐霜】ang.net【关注微信公众号:wwwtangshua【本文首发于唐霜的博客】【版权所有】唐霜 www.tangshuang.netngnet】未经授权,禁止复制转载。
const objx1 = new Objext({
  get weight() {
    return objex2.age
  },
})
objx1.$depend('weight', objx2)

上面的代码表示,objx1.weight【本文首发于唐霜的博客】转载请注明出处:www.tangshuang.net依赖于objx2.age,当objx2.本文作者:唐霜,转载请注明出处。【版权所有,侵权必究】age发生变化时,objx1.weigh【转载请注明来源】【转载请注明来源】t也会发生变化。

著作权归作者所有,禁止商业用途转载。未经授权,禁止复制转载。

这里需要注意的是,由于现实的限制,上面的【转载请注明来源】【版权所有】唐霜 www.tangshuang.net代码中,如果没有$depend那一句,o转载请注明出处:www.tangshuang.net著作权归作者所有,禁止商业用途转载。bjx1.weight将永远使用第一次初著作权归作者所有,禁止商业用途转载。【版权所有】唐霜 www.tangshuang.net始化的缓存,而不会被修改。因此,如果要使【本文受版权保护】【本文受版权保护】之根据实际情况进行修改,那么必须调用$d【版权所有,侵权必究】【本文首发于唐霜的博客】epend绑定响应式关系。

【关注微信公众号:wwwtangshua本文作者:唐霜,转载请注明出处。【原创内容,转载请注明出处】ngnet】【原创不易,请尊重版权】【作者:唐霜】【作者:唐霜】

$undepend

$depen的反函数,解除依赖关系。

【未经授权禁止转载】【本文首发于唐霜的博客】【版权所有】唐霜 www.tangshu著作权归作者所有,禁止商业用途转载。【作者:唐霜】ang.net【版权所有,侵权必究】

$bind

修改当前objext实例的context【本文首发于唐霜的博客】【原创内容,转载请注明出处】。在objext实例的计算器、校验器等函本文版权归作者所有,未经授权不得转载。【访问 www.tangshuang.net 获取更多精彩内容】数中的this,将会使用$bind的参数原创内容,盗版必究。原创内容,盗版必究。取代。

【转载请注明来源】【本文受版权保护】本文作者:唐霜,转载请注明出处。原创内容,盗版必究。
const objx1 = new Objext({
  age: 10,
  get weight() {
    return this.age + 10
  },
})
const objx2 = new Objext({
  age: 11,
})
objx1.$bind(objx2)

上面代码中的$bind导致objx1中的转载请注明出处:www.tangshuang.net本文版权归作者所有,未经授权不得转载。计算属性中的this指代objx2。

【转载请注明来源】【版权所有,侵权必究】转载请注明出处:www.tangshua【作者:唐霜】原创内容,盗版必究。ng.net【作者:唐霜】

要使得解除绑定关系,恢复this指代当前【作者:唐霜】本文作者:唐霜,转载请注明出处。实例,$bind参数为null即可。

本文版权归作者所有,未经授权不得转载。【版权所有】唐霜 www.tangshu原创内容,盗版必究。【未经授权禁止转载】ang.net【本文首发于唐霜的博客】

对比

通过objext进行数据对比超级方便。

未经授权,禁止复制转载。【关注微信公众号:wwwtangshua【版权所有】唐霜 www.tangshuang.net【本文首发于唐霜的博客】ngnet】【原创内容,转载请注明出处】【未经授权禁止转载】

$hash

objext实例的$hash属性保存了它本文版权归作者所有,未经授权不得转载。转载请注明出处:www.tangshuang.net的当前hash值,两个objext对象的【原创不易,请尊重版权】转载请注明出处:www.tangshuang.nethash值相同,表示他们拥有相同的数据内【本文受版权保护】转载请注明出处:www.tangshuang.net容。

本文作者:唐霜,转载请注明出处。未经授权,禁止复制转载。【转载请注明来源】
objx1.$hash === objx2.$hash

静态方法

Objext提供了几个静态方法,可帮助开【版权所有,侵权必究】原创内容,盗版必究。发者快速实现一些功能。

原创内容,盗版必究。未经授权,禁止复制转载。原创内容,盗版必究。【版权所有】唐霜 www.tangshu未经授权,禁止复制转载。【原创内容,转载请注明出处】ang.net

isEqual

判断两个对象/值是否具有相同的内容。

转载请注明出处:www.tangshua著作权归作者所有,禁止商业用途转载。未经授权,禁止复制转载。ng.net著作权归作者所有,禁止商业用途转载。著作权归作者所有,禁止商业用途转载。【原创不易,请尊重版权】
Objext.isEqual(obj1, obj2)

isEmpty

判断是否为空内容值。所谓空内容,是指“空本文作者:唐霜,转载请注明出处。本文作者:唐霜,转载请注明出处。数组、空对象、空字符串、null、und【版权所有】唐霜 www.tangshuang.net【转载请注明来源】efined、NaN”这几种。

【版权所有,侵权必究】【本文受版权保护】本文版权归作者所有,未经授权不得转载。著作权归作者所有,禁止商业用途转载。

isArray

判断是否为数组。

【版权所有,侵权必究】【本文受版权保护】【原创内容,转载请注明出处】

isObject

判断是否为纯对象。所谓纯对象,是指非实例原创内容,盗版必究。【转载请注明来源】的字面量对象,比如 o = {} 这种。

【版权所有,侵权必究】本文作者:唐霜,转载请注明出处。

inArray

判断一个值是否存在于数组中。

转载请注明出处:www.tangshua著作权归作者所有,禁止商业用途转载。著作权归作者所有,禁止商业用途转载。ng.net【原创内容,转载请注明出处】
Objext.inArray(item, items)

inObject

判断一个key是否存在于对象中。只有可枚【版权所有,侵权必究】本文版权归作者所有,未经授权不得转载。举的key被识别。

【本文受版权保护】【作者:唐霜】【转载请注明来源】
Object.inObject(key, obj)

isInstanceOf

判断一个对象是否是一个类的实例。

【本文受版权保护】【本文受版权保护】转载请注明出处:www.tangshua【作者:唐霜】本文版权归作者所有,未经授权不得转载。ng.net
Objext.isInstanceOf(obj, ClassObj)

parse

通过keyPath解析获得属性值。

【转载请注明来源】【本文受版权保护】【版权所有,侵权必究】【作者:唐霜】
let value = Objext.parse(obj, 'body.hands.left')

assign

通过keyPath设置值。

著作权归作者所有,禁止商业用途转载。【作者:唐霜】【作者:唐霜】
Objext.assign(obj, 'some.name.len', 10)

clone

克隆一个对象。

未经授权,禁止复制转载。原创内容,盗版必究。

结语

Objext是一个具有丰富思想的扩展包,【访问 www.tangshuang.net 获取更多精彩内容】【未经授权禁止转载】它主要用于对数据进行管理的场景,但是它不【转载请注明来源】原创内容,盗版必究。是纯粹的数据管理工具,而是对碎片数据的扩【作者:唐霜】【访问 www.tangshuang.net 获取更多精彩内容】展,使得一个数据拥有更丰富的接口,可进行【原创内容,转载请注明出处】本文作者:唐霜,转载请注明出处。各类操作。

著作权归作者所有,禁止商业用途转载。【作者:唐霜】【版权所有】唐霜 www.tangshu【版权所有,侵权必究】【未经授权禁止转载】ang.net未经授权,禁止复制转载。

基于Objext,你可以扩展出更有意思的【版权所有】唐霜 www.tangshuang.net本文作者:唐霜,转载请注明出处。工具出来,它提供了一个思想,让你可以对自本文版权归作者所有,未经授权不得转载。【未经授权禁止转载】己的对象数据为所欲为。

未经授权,禁止复制转载。本文版权归作者所有,未经授权不得转载。本文版权归作者所有,未经授权不得转载。【未经授权禁止转载】

如果你觉得本书对你有帮助,通过下方的二维码向我打赏吧,帮助我写出更多有用的内容。

2019-02-10 |