hasOwnProperty
为了判断一个对象是否包含自定义属性而不是原型链上的属性,
我们需要使用继承自Object.prototype
的hasOwnProperty
方法。
注意:通过判断一个属性是否undefined
是不够的。
因为一个属性可能确实存在,只不过它的值被设置为undefined
。
hasOwnProperty
是JavaScript中唯一一个处理属性但是不需要查找原型链的方法。
1
2
3
4
5
6
7
8
9
|
Object.prototype.bar
= 1;
var
foo = {goo: undefined};
foo.bar;
'bar'
in
foo;
foo.hasOwnProperty( 'bar' );
foo.hasOwnProperty( 'goo' );
|
只有hasOwnProperty
可以给出正确和期望的结果,这在遍历对象的属性时会很有用。没有其它方法可以用来排除原型链上的属性,而不是定义在对象自身上的属性。
hasOwnProperty
作为属性(hasOwnProperty
as
a property)
JavaScript不会保护hasOwnProperty
被非法占用,因此如果一个对象碰巧存在这个属性,
就需要使用外部的hasOwnProperty
函数来获取正确的结果。
1
2
3
4
5
6
7
8
9
10
11
|
var
foo = {
hasOwnProperty:
function ()
{
return
false ;
},
bar:
'Here
be dragons'
};
foo.hasOwnProperty( 'bar' );
{}.hasOwnProperty.call(foo,
'bar' );
|
结论(In conclusion)
当检查对象上某个属性是否存在时,hasOwnProperty
是唯一可用的方法。
同时在使用for
in
loop遍历对象时,推荐总是使用hasOwnProperty
方法,
这将会避免原型对象扩展带来的干扰。
函数(Functions)
函数是JavaScript中的一等对象,这意味着可以把函数像其它值一样传递。 一个常见的用法是把匿名函数作为回调函数传递对异步函数中。
函数声明(Thefunction
declaration)
上面的方法会在执行前被解析(hoisted),因此它存在于当前上下文的任意一个地方,
即使在函数定义体的上面被调用也是对的。
函数赋值表达式(Thefunction
expression)
这个例子把一个匿名的函数赋值给变量foo
。
1
2
3
|
foo;
foo();
var
foo = function ()
{};
|
由于var
定义了一个声明语句,对变量foo
的解析是在代码运行之前,因此foo
变量在代码运行时已经被定义过了。
但是由于赋值语句只在运行时执行,因此在相应代码执行之前,foo
的值缺省为undefined。
命名函数的赋值表达式(Named function expression)
另外一个特殊的情况是将命名函数赋值给一个变量。
1
2
3
4
|
var
foo = function
bar() {
bar();
}
bar();
|
bar
函数声明外是不可见的,这是因为我们已经把函数赋值给了foo
;
然而在bar
内部依然可见。这是由于 JavaScript 的命名处理所致,
函数名在函数内总是可见的。
this 的工作原理(Howthis
works)
JavaScript 有一套完全不同于其它语言的对this
的处理机制。 在五种不同的情况下
,this
指向的各不相同。
全局范围内(The global scope)
当在全部范围内使用this
,它将会指向全局对象。
(译者注:浏览器中运行的JavaScript脚本,这个全局对象是 window)
函数调用(Calling a function)
这里this
也会指向全局对象。
ES5 注意:在严格模式下(strict mode),不存在全局变量。 这种情况下this
将会是undefined
。
(译者注:ES5指的是ECMAScript 5,是2009-12发布的最新的 JavaScript 版本。)
方法调用(Calling a method)
这个例子中,this
指向test
对象。
调用构造函数(Calling a constructor)
如果函数倾向于和new
关键词一块使用,则我们称这个函数是构造函数。
在函数内部,this
指向新创建的对象。
显式的设置this
(Explicit setting ofthis
)
1
2
3
4
5
|
function
foo(a, b, c) {}
var
bar = {};
foo.apply(bar,
[1, 2, 3]);
foo.call(bar,
1, 2, 3);
|
当使用Function.prototype
上的call
或者apply
方法时,函数内的this
将会被显式设置为函数调用的第一个参数。
因此函数调用的规则在上例中已经不适用了,在foo
函数内this
被设置成了bar
。
注意:在对象的字面声明语法中,this
不能用来指向对象本身。
因此var obj = {me: this}
中的me
不会指向obj
,因为this
只可能出现在上述的五种情况中。
(译者注:这个例子中,如果是在浏览器中运行,obj.me等于window对象。)
常见误解(Common pitfalls)
尽管大部分的情况都说的过去,不过第一个规则(译者注:这里指的应该是第二个规则,也就是直接调用函数时,this
指向全局对象) 被认为是JavaScript语言另一个错误设计的地方,因为它从来就没有实际的用途。
1
2
3
4
5
6
|
Foo.method
= function ()
{
function
test() {
}
test();
}
|
一个常见的误解是test
中的this
将会指向Foo
对象,实际上不是这样子的。
为了在test
中获取对Foo
对象的引用,我们需要在method
函数内部创建一个局部变量指向Foo
对象。
1
2
3
4
5
6
7
|
Foo.method
= function ()
{
var
that = this ;
function
test() {
}
test();
}
|
that
只是我们随意起的名字,不过这个名字被广泛的用来指向外部的this
对象。
在closures一节,我们可以看到that
可以作为参数传递。
方法的赋值表达式(Assigning methods)
另一个看起来奇怪的地方是函数别名,也就是将一个方法赋值给一个变量。
1
2
|
var
test = someObject.methodTest;
test();
|
上例中,test
就像一个普通的函数被调用;因此,函数内的this
将不再被指向到someObject
对象。
虽然this
的晚绑定特性似乎并不友好,但是这确实基于原型继承赖以生存的土壤。
1
2
3
4
5
6
7
|
function
Foo() {}
Foo.prototype.method
= function ()
{};
function
Bar() {}
Bar.prototype
= Foo.prototype;
new
Bar().method();
|
当method
被调用时,this
将会指向Bar
的实例对象。
分享到:
相关推荐
JavaScript中hasOwnProperty函数方法是返回一个布尔值,指出一个对象是否具有指定名称的属性。 hasOwnProperty()使用方法: object.hasOwnProperty(proName)其中参数object是必选项。一个对象的实例。proName是必...
js-Polyfill_Object-...//Polyfilled & Native:console.dir([obj1.hasOwnProperty('a'),//trueobj1.hasOwnProperty('b'),//trueobj1.hasOwnProperty('c'),//falseobj2.hasOwnProperty('a'),//trueobj2.hasOwnProperty
hasOwnProperty() 方法用来判断某个对象是否含有指定的自身属性。 语法 obj.hasOwnProperty(prop) 参数 •prop •要检测的属性名称。 描述 所有继承了 Object.prototype 的对象都会从原型链上继承到 ...
hasOwnProperty()函数用于指示一个对象自身(不包括原型链)是否具有指定名称的属性。下面通过本文给大家分享JavaScript hasOwnProperty() 函数实例讲解,感兴趣的朋友一起看看吧
下面小编就为大家带来一篇详谈js使用in和hasOwnProperty获取对象属性的区别。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
JavaScript中hasOwnProperty函数方法是返回一个布尔值,指出一个对象是否具有指定名称的属性。 使用方法:object.hasOwnProperty(proName) 其中参数object是必选项。一个对象的实例。proName是必选项。一个属性名称...
一些JavaScript技巧可以使您的代码比以前更加出色! JavaScript是一种很棒的语言,但是您不时会迷失它现在提供的众多功能。 该存储库将为您提供一些简短明了的提示,以改进您的代码或使事情更容易阅读或更好地阅读...
JavaScript isPrototypeOf和hasOwnProperty的使用技巧,需要的朋友的朋友可以参考下。
in操作符只要通过对象能访问到属性就返回true。hasOwnProperty()只在属性存在于实例中时才返回true。下面通过本文给大家分享JavaScript中in和hasOwnProperty区别详解,感兴趣的朋友一起看看吧
// Poisoning Object.prototype Object.prototype.bar = 1; var foo = {goo: undefined}; foo.bar;...Javascript 中没有其他方法能判断一个属性是定义在对象本身还是继承自原型链。 hasOwnProperty 作为
hasOwnProperty :如果 object 具有指定名称的属性,那么方法返回 true;反之则返回 false。
教程名称:Javascript DOM编程视频教程(17讲) 课程目录:【】1.JavascriptDOM编程_在什么位置编写JS代码【】10.JavascriptDOM编程_删除节点【】11.JavascriptDOM编程_添加删除节点的实验...
js代码-去重:filter + hasOwnProperty
Using the Rest of This Book Section 1.10. Exploring JavaScript Part I: Core JavaScript Chapter 2. Lexical Structure Section 2.1. Character Set Section 2.2. Case Sensitivity Section 2.3....
当检测某个对象是否拥有某个属性时,hasOwnProperty 是唯一可以完成这一任务的方法,在 for in 循环时,建议增加 hasOwnProperty 进行判断,可以有效避免扩展本地原型而引起的错误
hasOwnProperty Section A.14. Object Appendix B. Bad Parts Section B.1. == Section B.2. with Statement Section B.3. eval Section B.4. continue Statement Section B.5. switch Fall Through ...
var hasOwn = Object.prototype.hasOwnProperty; var toStr = Object.prototype.toString; var defineProperty = Object.defineProperty; var gOPD = Object.getOwnPropertyDescriptor; var isArray = function ...