容易搞混的JavaScript方法:hasOwnProperty和isPrototypeOf
2011 年 10 月 10 日 by Ryan | 1 CommentViews: 95 Today Views: 1
说容易搞混,其实就是掌握得不好嘛,大家就别见怪了,我一向都是水过鸭背式地看书的。最后转性了,才认真地看字了。前面写过一篇类似的文章。
hasOwnProperty
介绍这个方法之前,先讲一下今天遇到的问题,我们一般要循环一个数组,我们会怎么办?
有两种方案可以选择,分别是for和for…in,问题是这两种方法有什么不同?
回答这个问题,我们只需要看例子:
1
2
3
4
5
6
7
8
9
10
11
12
13
Array.prototype.foo =
"someValue"
;
var
array = [
'a'
,
'b'
,
'c'
];
for
(
var
i
in
array) {
alert(array[i]);
}
Syntax
for
(prop
in
object){……}
//for in的语法:
//很显然这会枚举了所有方法属性,结果就会是a,b,c,someValue
//而for的话只会循环出a,b,c
这也就是别人所说的,不用for in的好处。在prototype库中,整个库都是以扩展Object的为基础的,这样就很容易出错。当然,本人是没有研究过Prototype这个库的,只是看过一点代码而已。那有什么方法可以让它只循环出只属于它自己的属性呢?
2011-12-09 补:
for in会循环出对象所有的function和prototype properties,hasOwnProperty方法是不会查找原型链的。
下面就是我们今天的第一个介绍的hasOwnProperty:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
var
obj = {
"a"
: 1,
"b"
: 2,
"c"
: 3
};
for
(
var
prop
in
obj) {
if
(obj.hasOwnProperty(prop)) {
// or if (Object.prototype.hasOwnProperty.call(obj,prop)) for safety...
alert(
"prop: "
+ prop +
" value: "
+ obj[prop])
}
}
//Syntax
//obj.hasOwnProperty(prop)
//由于时间问题,我已经去抄了一段代码。这个for in加上了一个hasOwnProperty来判断后,就能准确地找出我们想要的结果了。
//其中它还有一句Object.prototype.hasOwnProperty.call(obj,prop)),
//大概是因为在原型链中,使用最顶级的方法应该是最安全的,没有污染到它。
isPrototypeOf
1
2
Syntax
prototype.isPrototypeOf(object)
1
2
3
4
5
6
7
8
9
10
11
12
13
function
foo(){
this
.name =
'foo'
;
};
function
bar(){};
bar.prototype =
new
foo();
var
goo =
new
bar();
console.log(goo.name);
//foo
console.log(bar.prototype.isPrototypeOf(goo));
//true
//在bar的原型链中有当前对象goo,则isPrototypeOf方法返回true。
Categories: MyPost | Tags: hasOwnProperty, isPrototypeOf | Permalink
原文地址:http://www.coolicer.com/2011/10/10/javascript-hasownproperty-and-isprototypeof.html