函数JavaScript秘密花园 - hasOwnProperty,Functions,this

hasownproperty  时间:2021-02-27  阅读:()

JavaScript秘密花园-hasOwnProperty,Functions,thishasOwnProperty

为了判断一个对象是否包含自定义属性而不是原型链上的属性 我们需要使用继承自Object.prototype的hasOwnProperty方法。

注意:通过判断一个属性是否undefined是不够的。 因为一个属性可能确实存在只不过它的值被设置为undefined。hasOwnProperty是JavaScript中唯一一个处理属性但是不需要查找原型链的方法。?

只有hasOwnProperty可以给出正确和期望的结果这在遍历对象的属性时会很有用。没有其它方法可以用来排除原型链上的属性而不是定义在对象自身上的属性。hasOwnProperty作为属性hasOwnProperty as a property

JavaScript不会保护hasOwnProperty被非法占用因此如果一个对象碰巧存在这个属性就需要使用外部的hasOwnProperty函数来获取正确的结果。

?

结论In conclusion

当检查对象上某个属性是否存在时 hasOwnProperty是唯一可用的方法。 同时在使用for in loop遍历对象时推荐总是使用hasOwnProperty方法 这将会避免原型对象扩展带来的干扰。

函数Functions

函数是JavaScript中的一等对象这意味着可以把函数像其它值一样传递。 一个常见的用法是把匿名函数作为回调函数传递对异步函数中。

函数声明The function declaration

?

1 function foo() {}

上面的方法会在执行前被解析hoisted 因此它存在于当前上下文的任意一个地方 即使在函数定义体的上面被调用也是对的。

?

1 foo() ; //正常运行 因为foo在代码运行前已经被创建

2 function foo() {}

函数赋值表达式The function expression

?

1 var foo = function() {} ;

这个例子把一个匿名的函数赋值给变量foo。

?

由于var定义了一个声明语句对变量foo的解析是在代码运行之前因此foo变量在代码运行时已经被定义过了。

但是由于赋值语句只在运行时执行因此在相应代码执行之前 foo的值缺省为undefined。命名函数的赋值表达式Named function expression

另外一个特殊的情况是将命名函数赋值给一个变量。

?

bar函数声明外是不可见的这是因为我们已经把函数赋值给了foo 然而在bar内部依然可见。这是由于JavaScript的命名处理所致 函数名在函数内总是可见的。this的工作原理How this works

JavaScript有一套完全不同于其它语言的对this的处理机制。 在五种不同的情况下this指向的各不相同。

全局范围内 The global scope

?

1 this;

当在全部范围内使用this它将会指向全局对象。 译者注浏览器中运行的JavaScript脚本这个全局对象是window

函数调用Cal l ing a function

?

1 foo() ;

这里this也会指向全局对象。

ES5注意:在严格模式下strict mode 不存在全局变量。 这种情况下this将会是undef ined。 译者注ES5指的是ECMAScript 5是2009-12发布的最新的JavaScript版本。 

方法调用Cal l ing a method

?

1 test.foo() ;

这个例子中 this指向test对象。

调用构造函数Cal ling a constructor

?

1 new foo() ;

如果函数倾向于和new关键词一块使用则我们称这个函数是构造函数。 在函数内部this指向新创建的对象。

显式的设置this Expl icitsetting of this

?

当使用Function.prototype上的call或者apply方法时 函数内的this将会被显式设置为函数调用的第一个参数。

因此函数调用的规则在上例中已经不适用了在foo函数内this被设置成了bar。注意:在对象的字面声明语法中 this不能用来指向对象本身。 因此var obj = {me:this}中的me不会指向obj 因为this只可能出现在上述的五种情况中。 译者注这个例子中如果是在浏览器中运行 obj.me等于window对象。 

常见误解Common pitfalls

尽管大部分的情况都说的过去不过第一个规则译者注这里指的应该是第二个规则也就是直接调用函数时 this指向全局对象 被认为是JavaScript语言另一个错误设计的地方 因为它从来就没有实际的用途。

?

一个常见的误解是test中的this将会指向Foo对象实际上不是这样子的。

为了在test中获取对Foo对象的引用我们需要在method函数内部创建一个局部变量指向Foo对象。

?

that只是我们随意起的名字不过这个名字被广泛的用来指向外部的this对象。在closures一节我们可以看到that可以作为参数传递。

方法的赋值表达式Assigning methods

另一个看起来奇怪的地方是函数别名也就是将一个方法赋值给一个变量。

?

1 var test = someObject.methodTest;

2 test() ;

上例中 test就像一个普通的函数被调用 因此 函数内的this将不再被指向到someObject对象。

虽然this的晚绑定特性似乎并不友好但是这确实基于原型继承赖以生存的土壤。?

6

7 new Bar() .method() ;

当method被调用时 this将会指向Bar的实例对象。

RackNerd :美国大硬盘服务器促销/洛杉矶multacom数据中心/双路e5-2640v2/64G内存/256G SSD+160T SAS/$389/月

大硬盘服务器、存储服务器、Chia矿机。RackNerd,2019年末成立的商家,主要提供各类KVM VPS主机、独立服务器和站群服务器等。当前RackNerd正在促销旗下几款美国大硬盘服务器,位于洛杉矶multacom数据中心,亚洲优化线路,非常适合存储、数据备份等应用场景,双路e5-2640v2,64G内存,56G SSD系统盘,160T SAS数据盘,流量是每月200T,1Gbps带宽,配5...

ShineServers(5美元/月)荷兰VPS、阿联酋VPS首月五折/1核1G/50GB硬盘/3TB流量/1Gbps带宽

优惠码50SSDOFF 首月5折50WHTSSD 年付5折15OFF 85折优惠,可循环使用荷兰VPSCPU内存SSD带宽IPv4价格购买1核1G50G1Gbps/3TB1个$ 9.10/月链接2核2G80G1Gbps/5TB1个$ 12.70/月链接2核3G100G1Gbps/7TB1个$ 16.30/月链接3核4G150G1Gbps/10TB1个$ 18.10/月链接阿联酋VPSCPU内存SS...

数脉科技香港物理机 E3 16G 10M 华为线路165元 阿里云线路 188元 Cera线路 157元

2021年9月中秋特惠优惠促销来源:数脉科技 编辑:数脉科技编辑部 发布时间:2021-09-11 03:31尊敬的新老客户:9月优惠促销信息如下,10Mbps、 30Mbps、 50Mbps、100Mbps香港优质或BGPN2、阿里云线路、华为云线路,满足多种项目需求!支持测试。全部线路首月五折起。数脉官网 https://my.shuhost.com/香港特价数脉阿里云华为云 10MbpsCN...

hasownproperty为你推荐
u盘无法读取我的U盘插进电脑后提示无法识别的USB设备,该怎么办?bbsxp老大!!您好!我是初学者!请问我的bbsxp如何更改顶端左面的LOGO??bbsxp怎么用 CUTEFTP上传BBSXP到FTP服务器中国电信互联星空中国电信互联星空是什么!怎么取消彩信中心短信中心的号码是多少iphone越狱后怎么恢复苹果手机越狱后怎么恢复直播加速手机上什么软件可以帮助直播加速,大神们推荐推荐免费qq空间装扮有办法免费装扮QQ空间吗??idc前线怎么知道我电脑是3兆的宽带?2012年正月十五2012年正月十五 几月几号
香港服务器租用99idc 堪萨斯服务器 创宇云 一点优惠网 微信收钱 免费美国空间 太原网通测速平台 网游服务器 卡巴斯基是免费的吗 in域名 网站加速软件 阿里dns hdchina 香港博客 websitepanel htaccess 中国域名根服务器 paypal登陆 let nano 更多