http://xiangai.taobao.com
http://shop148612228.taobao.com

hasOwnProperty和isPrototypeOf

容易搞混的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

posted @ 2012-04-18 23:14  万事俱备就差个程序员  阅读(222)  评论(0编辑  收藏  举报

http://xiangai.taobao.com
http://shop148612228.taobao.com
如果您觉得对您有帮助.领个红包吧.谢谢.
支付宝红包
微信打赏 支付宝打赏