CN113326031A - 属性获取方法和装置 - Google Patents
属性获取方法和装置 Download PDFInfo
- Publication number
- CN113326031A CN113326031A CN202110594722.4A CN202110594722A CN113326031A CN 113326031 A CN113326031 A CN 113326031A CN 202110594722 A CN202110594722 A CN 202110594722A CN 113326031 A CN113326031 A CN 113326031A
- Authority
- CN
- China
- Prior art keywords
- attribute
- target
- attribute value
- currently read
- value
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Granted
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/20—Software design
- G06F8/24—Object-oriented
-
- Y—GENERAL TAGGING OF NEW TECHNOLOGICAL DEVELOPMENTS; GENERAL TAGGING OF CROSS-SECTIONAL TECHNOLOGIES SPANNING OVER SEVERAL SECTIONS OF THE IPC; TECHNICAL SUBJECTS COVERED BY FORMER USPC CROSS-REFERENCE ART COLLECTIONS [XRACs] AND DIGESTS
- Y02—TECHNOLOGIES OR APPLICATIONS FOR MITIGATION OR ADAPTATION AGAINST CLIMATE CHANGE
- Y02D—CLIMATE CHANGE MITIGATION TECHNOLOGIES IN INFORMATION AND COMMUNICATION TECHNOLOGIES [ICT], I.E. INFORMATION AND COMMUNICATION TECHNOLOGIES AIMING AT THE REDUCTION OF THEIR OWN ENERGY USE
- Y02D10/00—Energy efficient computing, e.g. low power processors, power management or thermal management
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- General Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
- Stored Programmes (AREA)
Abstract
本发明公开了一种属性获取方法和装置。其中,该方法包括:获取源对象和目标属性,其中,源对象包含多个属性,多个属性采用多层嵌套结构,目标属性为多个属性中待获取属性值的属性;按照多个属性的层级关系,通过代理对象依次读取每个属性的属性值,并将当前读取到的属性值与目标属性对应的目标条件进行比较,确定是否返回当前读取到的属性值;获取代理对象返回的属性值,得到目标属性的属性值。本发明解决了相关技术中获取深层级的对象属性会抛出异常的技术问题。
Description
技术领域
本发明涉及计算机领域,具体而言,涉及一种属性获取方法和装置。
背景技术
在JavaScript(简称为JS)语言中,由于属性链中间的任意一个属性值为undefined或null,都会导致程序抛出异常,因此,读取任意深层级的对象属性会抛出错异常。例如,对于一个对象a={b:{c:[{d:10}]}},当需要读取最里面的d属性值时,可以这样写:a.b.c[0].d。但是假如a对象是服务器接口返回的,由于某种原因,c属性值为null,即返回的对象是a={b:{c:null}},因为前端不知道会返回这种缺失属性的对象,如果继续使用属性链的方式读取里面的d属性值a.b.c[0].d,则会抛出异常Uncaught TypeError:Cannotread property'd'of null。
针对上述的问题,目前尚未提出有效的解决方案。
发明内容
本发明实施例提供了一种属性获取方法和装置,以至少解决相关技术中获取深层级的对象属性会抛出异常的技术问题。
根据本发明实施例的一个方面,提供了一种属性获取方法,包括:获取源对象和目标属性,其中,源对象包含多个属性,多个属性采用多层嵌套结构,目标属性为多个属性中待获取属性值的属性;按照多个属性的层级关系,通过代理对象依次读取每个属性的属性值,并将当前读取到的属性值与目标属性对应的目标条件进行比较,确定是否返回当前读取到的属性值;获取代理对象返回的属性值,得到目标属性的属性值。
可选地,将当前读取到的属性值与目标属性对应的目标条件进行比较,确定是否返回当前读取到的属性值包括:将当前读取到的属性值对应的第一属性名称与目标属性的第二属性名称进行比较;当第一属性名称与第二属性名称相同时,确定返回当前读取到的属性值。
可选地,当第一属性名称与第二属性名称不同时,该方法还包括:基于当前读取到的属性值,生成新的代理对象;通过新的代理对象读取每个属性的属性值,并将新读取到的属性值与目标属性对应的目标条件进行比较,确定是否返回新读取到的属性值。
可选地,基于当前读取到的属性值,生成新的代理对象包括:创建新对象;将当前读取到的属性值克隆到新对象中;更新该新对象的预设属性的属性值为当前读取到的属性值;基于更新后的新对象创建新的代理对象。
可选地,基于源对象和目标属性的第二属性名称,创建代理对象。
可选地,通过代理对象包含的预设函数拦截当前读取到的属性值,并将当前读取到的属性值与目标条件进行比较,确定是否返回当前读取到的属性值,其中,预设函数为代理对象的行为对象参数包含的属性。
可选地,基于目标属性的第二属性名称构建预设函数。
根据本发明实施例的另一方面,还提供了一种属性获取装置,包括:第一获取模块,用于获取源对象和目标属性,其中,源对象包含多个属性,多个属性采用多层嵌套结构,目标属性为多个属性中待获取属性值的属性;确定模块,用于按照多个属性的层级关系,通过代理对象依次读取每个属性的属性值,并将当前读取到的属性值与目标属性对应的目标条件进行比较,确定是否返回当前读取到的属性值;第二获取模块,用于获取代理对象返回的属性值,得到目标属性的属性值。
根据本发明实施例的另一方面,还提供了一种计算机可读存储介质,计算机可读存储介质包括存储的程序,其中,在程序运行时控制计算机可读存储介质所在设备执行上述的属性获取方法。
根据本发明实施例的另一方面,还提供了一种处理器,处理器用于运行程序,其中,程序运行时执行上述的属性获取方法。
在本发明实施例中,当需要读取源对象中任意深层级的目标属性时,首先按照多个属性的层级关系,通过代理对象依次读取每个属性的属性值,并将当前读取到的属性值与目标属性对应的目标条件进行比较,确定是否返回当前读取到的属性值,然后获取代理对象返回的属性值,即可得到需要读取的目标属性的属性值。容易注意到的是,由于可以通过代理对象决定是否返回读取到的属性值,而不是直接返回属性值,避免属性值为null或undefined时,导致程序抛出异常,进而解决了相关技术中获取深层级的对象属性会抛出异常的技术问题,从而达到增强代码的健壮性,减少线上代码运行出错对用户造成的影响的技术效果。
附图说明
此处所说明的附图用来提供对本发明的进一步理解,构成本申请的一部分,本发明的示意性实施例及其说明用于解释本发明,并不构成对本发明的不当限定。在附图中:
图1是根据本发明实施例的一种属性获取方法的流程图;
图2是根据本发明实施例的一种可选的JS对象的示意图;
图3是根据本发明实施例的一种可选的安全读取对象深层级属性的方法的流程图;
图4是根据本发明实施例的一种属性获取装置的示意图。
具体实施方式
为了使本技术领域的人员更好地理解本发明方案,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分的实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都应当属于本发明保护的范围。
需要说明的是,本发明的说明书和权利要求书及上述附图中的术语“第一”、“第二”等是用于区别类似的对象,而不必用于描述特定的顺序或先后次序。应该理解这样使用的数据在适当情况下可以互换,以便这里描述的本发明的实施例能够以除了在这里图示或描述的那些以外的顺序实施。此外,术语“包括”和“具有”以及他们的任何变形,意图在于覆盖不排他的包含,例如,包含了一系列步骤或单元的过程、方法、系统、产品或设备不必限于清楚地列出的那些步骤或单元,而是可包括没有清楚地列出的或对于这些过程、方法、产品或设备固有的其它步骤或单元。
为了安全的读取对象深层级属性而不报错,目前主要存在如下三种方法:
第一种方法可以是使用与门对属性链上的每个属性进行逐个判断,只有不为null或undefined才继续读取下一下属性。比如要读取a.b.c.d,则需要将其改成a.b&&a.b.c&&a.b.c.d。虽然这种方法能确保读取的属性是安全的,但是写法比较复杂,需要多个与门的配合。
第二种方法可以是使用开源库lodash的get()方法。例如,要读取a.b.c.d,使用lodash的get方法则可以写成lodah.get(a,'b.c.d')。虽然这种方法相对简洁,但是跟原生JS的写法不一致,并且额外引入第三方代码会导致项目变得比较大。
第三种方法是使用ES2020新标准的可选链操作符Optional chaining(?.)。例如,要读取a.b.c.d,使用可选链操作符就可以写成a?.b?.c?.d。这种方法虽然写法很简洁,但是目前还有好多浏览器不支持,需要使用babel转换成其他语法才可以正常运行。
由上可知,上述三种方法均存在一些缺点,为了解决上述问题,本申请提供了一种使用简单并且兼容性良好的属性获取方法,具体实现方案如下:
根据本发明其中一个实施例,提供了一种属性获取方法,需要说明的是,在附图的流程图示出的步骤可以在诸如一组计算机可执行指令的计算机系统中执行,并且,虽然在流程图中示出了逻辑顺序,但是在某些情况下,可以以不同于此处的顺序执行所示出或描述的步骤。
图1是根据本发明实施例的一种属性获取方法的流程图,该方法是一种基于Proxy的安全读取JavaScript对象的深层属性的方法,如图1所示,该方法包括如下步骤:
步骤S102,获取源对象和目标属性,其中,源对象包含多个属性,多个属性采用多层嵌套结构,目标属性为多个属性中待获取属性值的属性。
上述步骤中的源对象可以是web页面中的JavaScript对象,该对象的多个属性采用多层嵌套结构,也即,该对象的多个属性构成了属性链,例如,以如图2所示的游戏论坛的网页为例进行说明,源对象可以是response,该对象包含位于第一个层级的3个属性,分别为code、msg和result;属性result包含位于第二个层级的3个属性,分别为base、date和recent_douji;属性base包含位于第二个层级的8个属性,分别为equip_15、equip_num、max_level_hero、role_lv、role_name、server、ssr_sp_num和time;属性recent_douji包含位于第二个层级的2个属性,分别为last_updatetime和latest3[],其中,latest3[0]为属性battle_result,latest3[1]为属性d_high_damage,latest3[2]为属性d_high_damage_skill,latest3[3]为属性d_max_damage,latest3[4]为属性d_max_damage_shishen,latest3[5]为属性d_role_id,latest3[6]为属性d_role_lv,latest3[7]为属性d_role_name,latest3[8]为属性d_score,latest3[9]为属性d_server。
上述步骤中的目标属性可以是根据实际需求所确定的多层嵌套结构中位于任意深层级的属性,例如,仍以如图2所示的游戏论坛的网页为例进行说明,目标属性可以是位于第一个层级的属性,如属性code,也可以是位于第二个层级的属性,如属性date,还可以是位于第二个层级的属性,如属性equip_15、属性battle_result。需要说明的是,由于读取位于越深层级的属性,越容易出现程序抛出异常的问题,因此,在实际应用场景中,目标属性可以是位于较深层级的属性,如最下层的属性。
步骤S104,按照多个属性的层级关系,通过代理对象依次读取每个属性的属性值,并将当前读取到的属性值与目标属性对应的目标条件进行比较,确定是否返回当前读取到的属性值。
上述步骤中的代理对象可以是ES6(又称为ES2015)定义的标准对象Proxy,目前已经有大多数浏览器支持该功能,Proxy对象用于创建一个对象的代理,从而实现基本操作的拦截和自定义,其使用语法如下:conct p=new Proxy(target,handler),其中,target参数表示需要使用Proxy包装的对象,handler参数通过以函数作为属性,各属性的函数分别定义了在执行各种操作时代理p的行为。在一种可选的实施例中,为了实现属性读取和判断过程,可以在Proxy对象的handler上定义一个函数(如getter()函数),通过该函数可以拦截属性的读取操作,并将当前读取到的属性值与目标属性对应的目标条件进行比较,确定是否返回当前读取到的属性值。
需要说明的是,对于采用多层嵌套结构的多个属性,通常采用属性链递归读取的方式进行属性读取,也即,对于采用多层嵌套结构的多个属性,属性读取的本质是按照层级关系,分步依次读取每个属性,例如,以读取图2中的目标属性battle_result为例进行说明,可以按照层级关系,首先读取源对象response上的属性result,也即response.result,得到一个新的对象temp1,然后读取temp1上的属性recent_douji,也即temp1.recent_douji,得到一个新的对象temp2,然后再读取temp2上的属性lastest3[0],也即temp2.lastest3[0]。
在本发明实施例中,可以将普通对象转换为代理对象,将读取普通对象的属性改成读取代理对象的属性,通过代理对象按照属性链递归读取每个属性的属性值,例如,仍以读取图2中的目标属性battle_result为例进行说明,首先通过Proxy对象读取位于第一个层级的属性result,然后通过Proxy对象读取位于属性result的下一个层级的属性recent_douji,然后再通过Proxy对象读取位于属性recent_douji的下一个层级的属性lastest3[0]。
上述步骤中的目标条件可以是根据实际属性读取需要所确定的条件,为了确保最终返回的属性值为目标属性的属性值,在一种可选的实施例中,目标条件可以是目标属性的属性名称,如果当前读取到的属性的属性名称与目标属性的属性名称相同,则确定返回当前读取到的属性值,如果当前读取到的属性的属性名称与目标属性的属性名称不同,则确定不返回当前读取到的属性值,但不仅限于此。
需要说明的是,由于采用多层嵌套结构的属性是一层一层依次读取的,为了减少读取量,可以将目标条件作为属性读取的结束条件,也即,如果当前读取到的属性与目标条件匹配,则确定返回当前读取到的属性值,并停止读取其他属性的属性值;如果当前读取到的属性与目标条件匹配,则确定不返回当前读取到的属性值,并继续读取下一个层级的属性的属性值。
例如,仍以读取图2中的目标属性battle_result为例进行说明,可以通过对象转换函数createSafeObject(response),生成代理对象safeObject,通过属性链接的方式读取目标属性,也即,通过该代理对象依次读取属性result、属性recent_douji和属性lastest3[0],一种可选的实现代码如下:
safeObject.result.recent_douji.lastest3[0].endKeyName
其中,endKeyName表示结束属性名称,作为属性读取的结束条件,endKeyName的取值为目标属性的属性名称。为了减少在读取不同属性时,代码修改量,可以在实现代码中采用“endKeyName”表示目标属性的属性名称,并通过定义的方式将“endKeyName”的具体取值定义为目标属性的属性名称,从而在需要读取的属性发生变化时,只需要更改endKeyName的定义,而不需要更改整个代码。例如,仍以读取图2中的目标属性battle_result为例进行说明,定义endKeyName的实现代码如下:
endKeyName='battle_result'。
步骤S106,获取代理对象返回的属性值,得到目标属性的属性值。
在本发明实施例中,由于只有在当前读取到的属性与目标条件匹配,也即当前读取到的属性是目标属性时,代理对象才会返回属性值,因此,可以直接将代理对象返回的属性值作为最终读取到的目标属性的属性值。
通过本发明上述实施例,当需要读取源对象中任意深层级的目标属性时,首先按照多个属性的层级关系,通过代理对象依次读取每个属性的属性值,并将当前读取到的属性值与目标属性对应的目标条件进行比较,确定是否返回当前读取到的属性值,然后获取代理对象返回的属性值,即可得到需要读取的目标属性的属性值。容易注意到的是,由于可以通过代理对象决定是否返回读取到的属性值,而不是直接返回属性值,避免属性值为null或undefined时,导致程序抛出异常,进而解决了相关技术中获取深层级的对象属性会抛出异常的技术问题,从而达到增强代码的健壮性,减少线上代码运行出错对用户造成的影响的技术效果。
可选地,在本发明上述实施例中,将当前读取到的属性值与目标属性对应的目标条件进行比较,确定是否返回当前读取到的属性值包括:将当前读取到的属性值对应的第一属性名称与目标属性的第二属性名称进行比较;当第一属性名称与第二属性名称相同时,确定返回当前读取到的属性值。
需要说明的是,上述步骤中的“第一属性名称”和“第二属性名称”均表示属性名称,“第一”和“第二”仅用于区别两个属性名称对应的属性。
在本发明实施例中,以目标条件是目标属性的属性名称为例进行说明,可以通过代理对象自动拦截属性的读取操作,并获取当前读取到的属性值对应的第一属性名称prop,进一步判断第一属性名称是否等于第二属性名称,如果相同,则确定递归读取属性结束,并返回该属性值;如果不同,则继续读取位于下一个层级的属性。
例如,仍以读取图2中的目标属性battle_result为例进行说明,首先读取源对象response上的属性result,此时可以确定当前读取到的属性值对应的第一属性名称“result”与目标属性的第二属性名称“battle_result”不同,因此可以继续读取位于属性result的下一个层级的属性recent_douji,此时可以确定当前读取到的属性值对应的第一属性名称“recent_douji”与目标属性的第二属性名称“battle_result”不同,因此可以继续读取位于属性recent_douji的下一个层级的属性lastest3[0],此时可以确定当前读取到的属性值对应的第一属性名称“battle_result”与目标属性的第二属性名称“battle_result”相同,属性读取结束,并返回读取到的属性值。
可选地,在本发明上述实施例中,当第一属性名称与第二属性名称不同时,该方法还包括:基于当前读取到的属性值,生成新的代理对象;通过新的代理对象读取每个属性的属性值,并将新读取到的属性值与目标属性对应的目标条件进行比较,确定是否返回新读取到的属性值。
在本发明实施例中,由于读取源对象的深层级属性的本质是分步读取多个属性,每读取一个属性,都会得到一个新对象,然后再读取新对象的属性。进一步地,由于需要基于代理对象进行属性读取,因此,每次读取到属性值之后,如果确定当前读取的属性值对应的第一属性名称不等于目标属性的第二属性名称,则需要创建一个新的代理对象,并通过新的代理对象继续读取位于下一个层级的属性,直至当前读取的属性值对应的第一属性名称等于目标属性的第二属性名称。
例如,仍以读取图2中的目标属性battle_result为例进行说明,首先通过Proxy0读取源对象response上的属性result,此时可以确定当前读取到的属性值对应的第一属性名称“result”与目标属性的第二属性名称“battle_result”不同,因此,可以基于当前读取到的属性值,生成新的代理对象Proxy1,并通过Proxy1继续读取位于属性result的下一个层级的属性recent_douji,此时可以确定当前读取到的属性值对应的第一属性名称“recent_douji”与目标属性的第二属性名称“battle_result”不同,因此,可以基于当前读取到的属性值,生成新的代理对象Proxy2,并通过Proxy2继续读取位于属性recent_douji的下一个层级的属性lastest3[0],此时可以确定当前读取到的属性值对应的第一属性名称“battle_result”与目标属性的第二属性名称“battle_result”相同,属性读取结束,并返回读取到的属性值。
可选地,在本发明上述实施例中,基于当前读取到的属性值,生成新的代理对象包括:创建新对象;将当前读取到的属性值克隆到新对象中;更新该新对象的预设属性的属性值为当前读取到的属性值;基于更新后的新对象创建新的代理对象。
在一种可选的实施例中,可以首先定义对象转换函数createSafeObject(object),该函数可以接受一个对象object,并返回一个具备在handler上定义函数的Proxy对象,一种可选的实现代码如下:
function createSafeObject(object){
return new Proxy(object,handler);
}
在本发明实施例中,在确定当前读取的属性值对应的第一属性名称不等于目标属性的第二属性名称之后,可以创建一个新对象newObj,并将该新对象作为参数调用对象转换函数,生成新的代理对象并再次读取新的代理对象上的深层级属性。
需要说明的是,每次代理对象的生成都可以通过预先定义的对象转换函数实现,区别仅在于具体的参数值不同。例如,仍以读取图2中的目标属性battle_result为例进行说明,对于Proxy0,可以将源对象作为参数调用对象转换函数createSafeObject(response);对于Proxy1,由于读取了源对象response上的属性result,也即response.result,可以得到一个新的对象temp1,因此可以将新的对象temp1作为参数调用对象转换函数createSafeObject(temp1);对于Proxy0,由于读取了temp1上的属性recent_douji,也即temp1.recent_douji,可以得到一个新的对象temp2,因此可以将新的对象temp2作为参数调用对象转换函数createSafeObject(temp2)。
由于在读取a.b.c时,由于不能确认a.b的属性值是不是对象,如果该属性值是null、undefined或其他的原始类型,则在读取c属性时,会变成null.c、undefined.c或原始类型.c,进而导致抛出异常的。因此,为了确保返回一个对象类型,防止读取下一个属性时因undefined或null引发的异常,在本发明实施例中,在创建新对象之后,可以将当前读取到的属性值obj[prop]展开到新对象中,也即,将当前读取到的属性值直接克隆到新对象中。
另外,由于可以将目标条件(即目标属性的第二属性名称)作为属性读取的结束条件,如果当前读取的属性名称safeObject.b.c没有第二属性名称,则得到的结果不是最终值,而是一个安全对象,如果想要得到最终的具体值,则必须增加第二属性名称。在本发明实施例中,为了减少代码修改量,整个实现代码中采用“endKeyName”表示第二属性名称,因此,可以在新对象上添加的属性endKeyName,并将其属性值设置为当前属性值obj[prop],一种可选的实现代码如下:
newObj[endKeyName]=obj[prop]。
例如,仍以读取图2中的目标属性battle_result为例进行说明,首先通过Proxy0读取源对象response上的属性result,此时可以确定当前读取到的属性值对应的第一属性名称“result”与目标属性的第二属性名称“battle_result”不同,因此,可以创建新对象temp1,将当前读取到的属性值克隆到temp1中,并使得temp1的属性endKeyName的属性值为当前读取到的属性值,进一步将temp1作为参数调用createSafeObject(temp1),生成新的代理对象Proxy1。然后通过Proxy1继续读取位于属性result的下一个层级的属性recent_douji,此时可以确定当前读取到的属性值对应的第一属性名称“recent_douji”与目标属性的第二属性名称“battle_result”不同,因此,可以创建新对象temp2,将当前读取到的属性值克隆到temp2中,并使得temp2的属性endKeyName的属性值为当前读取到的属性值,进一步将temp2作为参数调用createSafeObject(temp2),生成新的代理对象Proxy2。然后再通过Proxy2继续读取位于属性recent_douji的下一个层级的属性lastest3[0],此时可以确定当前读取到的属性值对应的第一属性名称“battle_result”与目标属性的第二属性名称“battle_result”相同,属性读取结束,并返回读取到的属性值。
可选地,在本发明上述实施例中,基于源对象和目标属性的第二属性名称,创建代理对象。
在本发明实施例中,以目标条件是目标属性的属性名称为例进行说明,一种可选的实现代码如下:
//调用createSafeObject将源对象object转换成代理对象safeObject
const safeObject=createSafeObject(object,'endKeyName');
需要说明的是,为了减少在读取不同源对象的属性时,代码修改量,可以在实现代码中采用“object”表示源对象,并通过定义的方式将“object”的具体取值定义为当前需要读取属性的源对象,从而在需要读取属性的源对象发生变化时,只需要更改object的定义,而不需要更改整个代码。例如,仍以读取图2中的目标属性battle_result为例进行说明,定义object的实现代码如下:
const object={result:{recent_douji:{lastest3[0]:0.0};
可选地,在本发明上述实施例中,通过代理对象包含的预设函数拦截当前读取到的属性值,并将当前读取到的属性值与目标条件进行比较,确定是否返回当前读取到的属性值,其中,预设函数为代理对象的行为对象参数包含的属性。
上述步骤中的预设函数可以是在行为对象handler上定义的获取函数getter(),通过获取函数getter()可以自动拦截属性的读取操作,并将当前读取到的属性值与目标属性对应的目标条件进行比较,确定是否返回当前读取到的属性值。
在本发明实施例中,可以首先定义行为对象handler,并在该行为对象handler上定义获取函数getter()。然后通过获取函数getter()可以自动拦截属性的读取操作,并将判断当前读取的第一属性名称prop是否等于预先定义的endKeyName(此时,endKeyName的取值为目标属性的第二属性名称),如果相等则返回该属性值;否则,创建一个新的对象newObj,将当前的属性值obj[prop]克隆到该新对象newObj中,并使newObj[endKeyName]=obj[prop],然后将该新对象newObj作为参数调用对象转换函数createSafeObject(newObj)生成新的代理对象并返回。
由上可知,行为对象handler的一种可选的实现代码如下:
可选地,在本发明上述实施例中,基于目标属性的第二属性名称构建预设函数。
需要说明的是,为了扩大实现代码的适用范围,可以在getter()中增加endKeyName作为结束条件,并预先定义endKeyName的取值为目标属性的第二属性名称,在此基础上,当需要读取不同的属性时,只需要修改endKeyName的取值即可,无需对getter()进行修改。
下面结合图3对本发明一种优选的实施例进行详细说明。如图3所示,本发明提供的一种基于Proxy的安全读取JavaScript对象深层级属性的方法的具体步骤如下:
步骤S31,定义结束属性名称endKeyName,可以将endKeyName的取值定义为目标属性的第二属性名称;
步骤S32,定义行为对象handler,在该行为对象handler上面定义getter()方法;
步骤S33,定义对象转换函数createSafeObject(object);
步骤S34,调用createSafeObject(object)生成代理对象safeObject,其中,需要提前定义object,将object的取值定义为源对象;
步骤S35,通过属性链接的方式读取safeObject上的深层属性;
步骤S36,自动调用handler上定义的getter(obj,prop)方法;
步骤S37,判断当前读取到的属性值对应的第一属性名称prop是否等于endKeyName,如果是,则进入步骤S38,如果否,则进入步骤S39;
步骤S38,返回当前读取到的属性值obj[prop];
步骤S39,创建一个新对象newObj,将当前读取到的属性值obj[prop]克隆到新对象中,并使newObj[endKeyName]=obj[prop],然后将新对象作为参数调用createSafeObject(newObj)生成新的代理对象safeObject,并返回执行步骤S35。
上述步骤S31至步骤S33是定义阶段,步骤S34至步骤S39是运行阶段,其中,定义阶段在程序运行时只会执行一次,而运行阶段在程序运行时会根据实际情况执行多次,因此,在步骤S31至步骤S33执行完毕后,主要利用步骤S34至步骤S39的运行阶段来读取源对象的深层级属性。
通过上述步骤提供的方案,可以安全的读取源对象的任意深层级的属性而不会抛出异常,能够增强代码的健壮性,从而减少线上代码运行出错对用户造成的影响。相比于传统的方法具备如下优点:兼容性良好,可运行于目前大多数的主流浏览器环境及Node.js环境;使用简单,跟普通读取对象属性的方法几乎一样,可以在已有的项目上很方便的接入;性能优越,采用代理进行拦截,可以非常高效的获取到源对象的属性值。
根据本发明其中一个实施例,提供了一种属性获取装置,该装置可以执行上述实施例中的属性获取方法,具体实现方案和应用场景与上述实施例相同,在此不作赘述。
图4是根据本发明实施例的一种属性获取装置的示意图,如图4所示,该装置包括:
第一获取模块42,用于获取源对象和目标属性,其中,源对象包含多个属性,多个属性采用多层嵌套结构,目标属性为多个属性中待获取属性值的属性;
确定模块44,用于按照多个属性的层级关系,通过代理对象依次读取每个属性的属性值,并将当前读取到的属性值与目标属性对应的目标条件进行比较,确定是否返回当前读取到的属性值;
第二获取模块46,用于获取代理对象返回的属性值,得到目标属性的属性值。
可选地,在本发明上述实施例中,确定模块包括:比较单元,用于将当前读取到的属性值对应的第一属性名称与目标属性的第二属性名称进行比较;确定单元,用于当第一属性名称与第二属性名称相同时,确定返回当前读取到的属性值。
可选地,在本发明上述实施例中,该装置还包括:生成模块,用于基于当前读取到的属性值,生成新的代理对象;确定模块还用于通过新的代理对象读取每个属性的属性值,并将新读取到的属性值与目标属性对应的目标条件进行比较,确定是否返回新读取到的属性值。
可选地,在本发明上述实施例中,生成模块包括:第一创建单元,用于创建新对象;克隆单元,用于将当前读取到的属性值克隆到新对象中;更新单元,用于更新该新对象的预设属性的属性值为当前读取到的属性值;第二创建单元,用于基于更新后的新对象创建新的代理对象。
可选地,在本发明上述实施例中,该装置还包括:创建模块,用于基于源对象和目标属性的第二属性名称,创建代理对象。
可选地,在本发明上述实施例中,确定模块还用于通过代理对象包含的预设函数拦截当前读取到的属性值,并将当前读取到的属性值与目标条件进行比较,确定是否返回当前读取到的属性值,其中,预设函数为代理对象的行为对象参数包含的属性。
可选地,在本发明上述实施例中,该装置还包括:构建模块,用于基于目标属性的第二属性名称构建预设函数。
根据本发明其中一个实施例,提供了一种计算机可读存储介质,计算机可读存储介质包括存储的程序,其中,在程序运行时控制计算机可读存储介质所在设备执行上述的属性获取方法。
根据本发明其中一个实施例,提供了一种处理器,处理器用于运行程序,其中,程序运行时执行上述的属性获取方法。
在本发明的上述实施例中,对各个实施例的描述都各有侧重,某个实施例中没有详述的部分,可以参见其他实施例的相关描述。
在本申请所提供的几个实施例中,应该理解到,所揭露的技术内容,可通过其它的方式实现。其中,以上所描述的装置实施例仅仅是示意性的,例如所述单元的划分,可以为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个单元或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些接口,单元或模块的间接耦合或通信连接,可以是电性或其它的形式。
所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目的。
另外,在本发明各个实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。上述集成的单元既可以采用硬件的形式实现,也可以采用软件功能单元的形式实现。
所述集成的单元如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的全部或部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可为个人计算机、服务器或者网络设备等)执行本发明各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:U盘、只读存储器(ROM,Read-Only Memory)、随机存取存储器(RAM,Random Access Memory)、移动硬盘、磁碟或者光盘等各种可以存储程序代码的介质。
以上所述仅是本发明的优选实施方式,应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明原理的前提下,还可以做出若干改进和润饰,这些改进和润饰也应视为本发明的保护范围。
Claims (10)
1.一种属性获取方法,其特征在于,包括:
获取源对象和目标属性,其中,所述源对象包含多个属性,所述多个属性采用多层嵌套结构,所述目标属性为所述多个属性中待获取属性值的属性;
按照所述多个属性的层级关系,通过代理对象依次读取每个属性的属性值,并将当前读取到的属性值与所述目标属性对应的目标条件进行比较,确定是否返回所述当前读取到的属性值;
获取所述代理对象返回的属性值,得到所述目标属性的属性值。
2.根据权利要求1所述的方法,其特征在于,将所述当前读取到的属性值与所述目标属性对应的目标条件进行比较,确定是否返回所述当前读取到的属性值包括:
将所述当前读取到的属性值对应的第一属性名称与所述目标属性的第二属性名称进行比较;
当所述第一属性名称与所述第二属性名称相同时,确定返回所述当前读取到的属性值。
3.根据权利要求2所述的方法,其特征在于,当所述第一属性名称与所述第二属性名称不同时,所述方法还包括:
基于所述当前读取到的属性值,生成新的代理对象;
通过所述新的代理对象读取所述每个属性的属性值,并将新读取到的属性值与所述目标属性对应的目标条件进行比较,确定是否返回所述新读取到的属性值。
4.根据权利要求3所述的方法,其特征在于,基于所述当前读取到的属性值,生成所述新的代理对象包括:
创建新对象;
将所述当前读取到的属性值克隆到所述新对象中;
更新所述新对象的预设属性的属性值为所述当前读取到的属性值;
基于更新后的新对象创建所述新的代理对象。
5.根据权利要求1所述的方法,其特征在于,基于所述源对象和所述目标属性的第二属性名称,创建所述代理对象。
6.根据权利要求5所述的方法,其特征在于,通过所述代理对象包含的预设函数拦截所述当前读取到的属性值,并将所述当前读取到的属性值与所述目标条件进行比较,确定是否返回所述当前读取到的属性值,其中,所述预设函数为所述代理对象的行为对象参数包含的属性。
7.根据权利要求6所述的方法,其特征在于,基于所述目标属性的第二属性名称构建所述预设函数。
8.一种属性获取装置,其特征在于,包括:
第一获取模块,用于获取源对象和目标属性,其中,所述源对象包含多个属性,所述多个属性采用多层嵌套结构,所述目标属性为所述多个属性中待获取属性值的属性;
确定模块,用于按照所述多个属性的层级关系,通过代理对象依次读取每个属性的属性值,并将当前读取到的属性值与所述目标属性对应的目标条件进行比较,确定是否返回所述当前读取到的属性值;
第二获取模块,用于获取所述代理对象返回的属性值,得到所述目标属性的属性值。
9.一种计算机可读存储介质,其特征在于,所述计算机可读存储介质包括存储的程序,其中,在所述程序运行时控制所述计算机可读存储介质所在设备执行权利要求1至7中任意一项所述的属性获取方法。
10.一种处理器,其特征在于,所述处理器用于运行程序,其中,所述程序运行时执行权利要求1至7中任意一项所述的属性获取方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202110594722.4A CN113326031B (zh) | 2021-05-28 | 2021-05-28 | 属性获取方法和装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202110594722.4A CN113326031B (zh) | 2021-05-28 | 2021-05-28 | 属性获取方法和装置 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN113326031A true CN113326031A (zh) | 2021-08-31 |
CN113326031B CN113326031B (zh) | 2023-08-22 |
Family
ID=77422317
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202110594722.4A Active CN113326031B (zh) | 2021-05-28 | 2021-05-28 | 属性获取方法和装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN113326031B (zh) |
Citations (14)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20020170041A1 (en) * | 2000-12-28 | 2002-11-14 | Stmicroelectronics Limited | Retrieval of symbol attributes |
CN1842767A (zh) * | 2003-06-26 | 2006-10-04 | 微软公司 | 用于多个异常处理模型的中间表示 |
CN1989543A (zh) * | 2003-10-23 | 2007-06-27 | 微软公司 | 媒体集成层 |
CN101231633A (zh) * | 2007-01-23 | 2008-07-30 | 北京北大方正电子有限公司 | 一种包括嵌套框对象的排版方法和装置 |
WO2012039085A1 (ja) * | 2010-09-22 | 2012-03-29 | 日本電気株式会社 | 属性情報処理装置、属性情報処理方法及び属性情報評価システム |
CN103294462A (zh) * | 2012-03-05 | 2013-09-11 | 阿里巴巴集团控股有限公司 | 对象映射处理方法、映射处理器和对象映射处理系统 |
CN104239072A (zh) * | 2014-10-15 | 2014-12-24 | 北京国双科技有限公司 | 软件的程序代码的生成方法及装置 |
CN104662535A (zh) * | 2012-07-24 | 2015-05-27 | 起元科技有限公司 | 数据模型中的实体映射 |
CN105122243A (zh) * | 2013-03-15 | 2015-12-02 | 亚马逊科技公司 | 用于半结构化数据的可扩展分析平台 |
US20170116257A1 (en) * | 2015-10-26 | 2017-04-27 | International Business Machines Corporation | Dynamic directory of objects based on logical attributes |
CN106919370A (zh) * | 2015-12-24 | 2017-07-04 | 北京国双科技有限公司 | 一种对象属性值的获取方法及装置 |
CN109725955A (zh) * | 2018-12-30 | 2019-05-07 | 北京城市网邻信息技术有限公司 | 一种访问对象属性方法、装置、设备及存储介质 |
CN112306462A (zh) * | 2019-08-02 | 2021-02-02 | 苏州精易会信息技术有限公司 | 一种积木式对象变量块构建方法、装置、存储介质和处理器 |
CN112347329A (zh) * | 2020-10-28 | 2021-02-09 | 杭州安恒信息技术股份有限公司 | 数据处理方法、装置、存储介质及设备 |
-
2021
- 2021-05-28 CN CN202110594722.4A patent/CN113326031B/zh active Active
Patent Citations (14)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20020170041A1 (en) * | 2000-12-28 | 2002-11-14 | Stmicroelectronics Limited | Retrieval of symbol attributes |
CN1842767A (zh) * | 2003-06-26 | 2006-10-04 | 微软公司 | 用于多个异常处理模型的中间表示 |
CN1989543A (zh) * | 2003-10-23 | 2007-06-27 | 微软公司 | 媒体集成层 |
CN101231633A (zh) * | 2007-01-23 | 2008-07-30 | 北京北大方正电子有限公司 | 一种包括嵌套框对象的排版方法和装置 |
WO2012039085A1 (ja) * | 2010-09-22 | 2012-03-29 | 日本電気株式会社 | 属性情報処理装置、属性情報処理方法及び属性情報評価システム |
CN103294462A (zh) * | 2012-03-05 | 2013-09-11 | 阿里巴巴集团控股有限公司 | 对象映射处理方法、映射处理器和对象映射处理系统 |
CN104662535A (zh) * | 2012-07-24 | 2015-05-27 | 起元科技有限公司 | 数据模型中的实体映射 |
CN105122243A (zh) * | 2013-03-15 | 2015-12-02 | 亚马逊科技公司 | 用于半结构化数据的可扩展分析平台 |
CN104239072A (zh) * | 2014-10-15 | 2014-12-24 | 北京国双科技有限公司 | 软件的程序代码的生成方法及装置 |
US20170116257A1 (en) * | 2015-10-26 | 2017-04-27 | International Business Machines Corporation | Dynamic directory of objects based on logical attributes |
CN106919370A (zh) * | 2015-12-24 | 2017-07-04 | 北京国双科技有限公司 | 一种对象属性值的获取方法及装置 |
CN109725955A (zh) * | 2018-12-30 | 2019-05-07 | 北京城市网邻信息技术有限公司 | 一种访问对象属性方法、装置、设备及存储介质 |
CN112306462A (zh) * | 2019-08-02 | 2021-02-02 | 苏州精易会信息技术有限公司 | 一种积木式对象变量块构建方法、装置、存储介质和处理器 |
CN112347329A (zh) * | 2020-10-28 | 2021-02-09 | 杭州安恒信息技术股份有限公司 | 数据处理方法、装置、存储介质及设备 |
Non-Patent Citations (6)
Title |
---|
2459644211: "使用lodash通过属性名称提取深层嵌套的子对象", 《HTTPS://QA.1R1G.COM/SF/ASK/2459644211/#》 * |
FLEXDINESH: "typy", 《HTTPS://GITHUB.COM/FLEXDINESH/TYPY/BLOB/MASTER/SRC/TYPY.JS》 * |
IT常识: "使用ramda按嵌套值过滤对象数组", 《HTTPS://IT.CHA138.COM/CODE/SHOW-168745.HTML》 * |
叶文全;: "CSS自定义属性在Web前端中的应用研究", 集宁师范学院学报, no. 06 * |
溜溜的阿溜: "lodash中的get方法", 《HTTPS://BLOG.CSDN.NET/CINDY647/ARTICLE/DETAILS/111382268》 * |
王燕璇: "嵌套访问_如何优雅地在JavaScript中访问嵌套对象", 《HTTPS://BLOG.CSDN.NET/WEIXIN_28925387/ARTICLE/DETAILS/112717124》 * |
Also Published As
Publication number | Publication date |
---|---|
CN113326031B (zh) | 2023-08-22 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN105511873B (zh) | 用户界面控件展示方法及装置 | |
CN103597469B (zh) | 集成开发环境中的实况浏览器工具 | |
JP5019578B2 (ja) | 記憶装置に記憶されたコンテンツのバージョンを更新する方法およびシステム | |
CN105739983B (zh) | 脚本程序编辑装置及其实现方法 | |
CN109710185B (zh) | 数据处理方法及装置 | |
KR100928192B1 (ko) | 내장형 디바이스에서의 3d 콘텐츠에 대한 오프라인 최적화파이프라인 | |
US20100257439A1 (en) | Render engine for spreadsheet | |
CN108509209A (zh) | 一种资源包的生成方法、装置、计算机设备及存储介质 | |
CN111249736B (zh) | 代码处理方法及装置 | |
CN108647025A (zh) | 文档对象模型中节点的处理方法及装置、电子和存储设备 | |
CN104166607B (zh) | 用于备份数据库的数据处理方法及装置 | |
CN110489421A (zh) | 数据存储方法、装置、计算机可读存储介质和计算机设备 | |
US9449063B2 (en) | Synchronization of form fields in a client-server environment | |
CN107423070A (zh) | 一种页面生成方法及装置 | |
CN103902520A (zh) | 主题编辑方法和移动终端 | |
CN106446140A (zh) | 用于数据持久化的方法及装置 | |
CN107832448A (zh) | 数据库操作方法、装置及设备 | |
US20130339309A1 (en) | Dynamic discovery of storage resource topology | |
US7966600B2 (en) | Distributed resource understanding tool management | |
CN113407284A (zh) | 导航界面的生成方法、装置、存储介质及电子设备 | |
WO2024198450A1 (zh) | 区块链中部署合约的方法和区块链节点 | |
CN113326031A (zh) | 属性获取方法和装置 | |
CN112799737A (zh) | 游戏资源的处理方法、装置、处理器和存储介质 | |
CN108416029A (zh) | 一种静态资源更新方法及系统 | |
JP2012088940A (ja) | 情報処理装置、情報処理方法、及びプログラム |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |