函数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的实例对象。

ucloud国内云服务器2元/月起;香港云服务器4元/首月;台湾云服务器3元/首月

ucloud云服务器怎么样?ucloud为了扩大云服务器市场份额,给出了超低价云服务器的促销活动,活动仍然是此前的Ucloud全球大促活动页面。目前,ucloud国内云服务器2元/月起;香港云服务器4元/首月;台湾云服务器3元/首月。相当于2-4元就可以试用国内、中国香港、中国台湾这三个地域的云服务器1个月了。ucloud全球大促仅限新用户,国内云服务器个人用户低至56元/年起,香港云服务器也仅8...

新网,域名7月盛夏1核心2G内存.COM域名仅19.9元/首年,主机9.9元/月,企业邮箱0元体验

新网好不好?新网域名便宜吗?新网怎么样?新网是国内老牌知名域名注册商,企业正规化运营,资质齐全,与阿里云万网和腾讯云DNSPOD同为国内服务商巨头。近日新网发布了最新的七月放价季优惠活动,主要针对域名、云主机、企业邮箱、SSL证书等多款云产品推送了超值的优惠,其中.com顶级域名仅19.9元/首年,.cn域名仅16元/首年,云主机1核心2G内存3Mbps带宽仅9.9元/月,企业邮箱更是免费送1年,...

半月湾hmbcloud升级500Mbps带宽,原生VPS,$4.99/月

关于半月湾HMBCloud商家之前也有几篇那文章介绍过这个商家的产品,对于他们家的其他产品我都没有多加留意,而是对他们家的DC5机房很多人还是比较喜欢的,这个比我们有些比较熟悉的某商家DC6 DC9机房限时,而且半月湾HMBCloud商家是相对便宜的。关于半月湾DC5机房的方案选择和介绍:1、半月湾三网洛杉矶DC5 CN2 GIA同款DC6 DC9 1G内存 1TB流量 月$4.992、亲测选择半...

hasownproperty为你推荐
雅虎社区雅虎是什么免费开通黄钻如何免费开通qq黄钻拂晓雅阁?英特尔和AMD有什么区别啊?渗透测试渗透测试的专业服务公章制作制作公章尺寸标准大小,字体,字号?http与https的区别https://和http://区别保护气球气球保护液可以用什么来代替?雅虎天盾有没有用用雅虎天盾的啊?创维云电视功能谁能具体介绍一下创维云电视的主要功能,以及基本的使用方式,如果能分型号介绍就更好了,O(∩_∩)O谢谢网站优化方案网站优化方案应该从哪些方面去分析?
查询ip 美国主机评测 安云加速器 外贸主机 cpanel主机 美国php主机 北京主机 个人空间申请 699美元 免费智能解析 天翼云盘 江苏双线服务器 空间购买 重庆电信服务器托管 美国盐湖城 畅行云 江苏徐州移动 七牛云存储 博客域名 google搜索打不开 更多