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的实例对象。
酷番云怎么样?酷番云就不讲太多了,介绍过很多次,老牌商家完事,最近有不少小伙伴,一直问我台湾VPS,比较难找好的商家,台湾VPS本来就比较少,也介绍了不少商家,线路都不是很好,有些需求支持Windows是比较少的,这里我们就给大家测评下 酷番云的台湾VPS,支持多个版本Linux和Windows操作系统,提供了CN2线路,并且还是原生IP,更惊喜的是提供的是无限流量。有需求的可以试试。可以看到回程...
如果我们较早关注NameCheap商家的朋友应该记得前几年商家黑色星期五和网络星期一的时候大促采用的闪购活动,每一个小时轮番变化一次促销活动而且限量的。那时候会导致拥挤官网打不开迟缓的问题。从去年开始,包括今年,NameCheap商家比较直接的告诉你黑色星期五和网络星期一为期6天的活动。没有给你限量的活动,只有限时六天,这个是到11月29日。如果我们有需要新注册、转入域名的可以参加,优惠力度还是比...
搬瓦工怎么样?2021年7月最新vps套餐推荐及搬瓦工优惠码整理,搬瓦工优惠码可以在购买的时候获取一些优惠,一般来说力度都在 6% 左右。本文整理一下 2021 年 7 月最新的搬瓦工优惠码,目前折扣力度最大是 6.58%,并且是循环折扣,续费有效,可以一直享受优惠价格续费的。搬瓦工优惠码基本上可能每年才会更新一次,大家可以收藏本文,会保持搬瓦工最新优惠码更新的。点击进入:搬瓦工最新官方网站搬瓦工...