hasOwnProperty 和 in

曾经对 hasOwnProperty() 方法和 in 操作符感到困惑,这回看书看到,就在这里再次归纳总结一下

-----------------------------------------------------------------------------------------

hasOwnPropertyin 都是用于检测 “对象是否包含某个属性(包括一般属性和方法,java里叫做对象成员)” :

  对象.hasOwnProperty("属性名称");      // "属性名称" 以字符串形式传递

  "属性名称" in 对象;              // 用法同上

某些情况下,两者效果一致,可以混用:

// 创建一个自定义对象
var obj_1 = {
    // 对象定义了自己的属性
    sayHi: function() {
        return "Hi~ I‘m an object";
    }
}
obj_1.hasOwnProperty("sayHi");        // 返回 true
"sayHi" in obj_1;                     // 返回 true

都返回 true。

但如果换种使用情况:

// 还是自定义对象
var obj_2 = {
    // 也定义了自己的方法
    sayHi: function() {
        return "Hi~ I‘m another object";
    }
}
obj_2.hasOwnProperty("toString");     // 返回 false
"toString" in obj_2;              // 返回 true

hsaOwnProperty 方法的返回结果跟上面不一样了。。

稍微对比前后两次使用情况,我们就可以发现其中的差别:

  前一个 hasOwnProperty 检测的是 sayHi 方法,由对象自己定义,结果返回 true。

  后一个 hasOwnProperty 检测的是 toString 方法,来自父类,结果返回 false。

产生什么结果是跟属性的来源有关么? 不是:

// 又是自定义对象
var obj_3 = {
    // 并且重写了 toString 方法
    toString: function() {
        return "This is function \"toString\" which overridden by obj_3";
    }
}

obj_3.hasOwnProperty("toString");    // 返回 true
"toString" in obj_3;            // 返回 true

这个 toString 仍是来源于父类,不同的是它经过了重写,然后结果也跟着不一样了。

“重写”在这其中起了什么作用?

如果要用一个词概括的话那应该是“专属”:

  被重写的属性只属于重写了它的对象,这个对象独自拥有了这个属性(的拷贝),使用时无需再从父类身上寻找和获取。而被重写的属性也打上了专属于这个对象的印记,这个属性无法被别的对象(用hasOwnProperty)检测为true。

因此 如果按照字面意思,将 对象.hasOwnProperty("xx") 理解成:“对象是否拥有xx属性” 显然是不够准确的——根类的属性为所有对象所共有,却无法检测为true。

更准确的说法应该是:“xx属性是否为指定对象所独有” 。

那 in 呢?

从上面的结果看,in 总是返回 true ——不管“公有”、“私有”,不管是自己的还是父类的。

只要 hasOwnProperty 为 true,in 必为 true。in 的判定范围大于 hasOwnProperty 的判定范围。

如果把 hasOwnProperty 理解为“专属”,那 in 就是 专属+父类(或者说原型链),范围是“一个体系”。

所以 "xx" in 对象 可以理解成:“xx属性是否存在于指定对象所代表的体系里”。

总结:

  hasOwnProperty 用于检测 某个属性是否指定对象的专属属性。

  in 用于检测 某个属性是否存在于对象或它的原型链中。

hasOwnProperty 和 in,布布扣,bubuko.com

时间: 2024-10-22 06:04:23

hasOwnProperty 和 in的相关文章

hasOwnProperty与isPrototypeOf

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>hasOwnProperty与isPrototypeOf</title> </head> <body> <script> // hasOwnProperty:是用来判断一个对象是否有你给出名称的属性或对象.不过需要注意的是

JS中isPrototypeOf 和hasOwnProperty 的区别

1.isPrototypeOf isPrototypeOf是用来判断指定对象object1是否存在于另一个对象object2的原型链中,是则返回true,否则返回false. 格式如下: object1.isPrototypeOf(object2); object1是一个对象的实例: object2是另一个将要检查其原型链的对象. 原型链可以用来在同一个对象类型的不同实例之间共享功能. 如果 object2 的原型链中包含object1,那么 isPrototypeOf 方法返回 true. 如

js中的hasOwnProperty()和isPrototypeOf()

js中的hasOwnProperty()和isPrototypeOf() 这两个属性都是Object.prototype所提供:Object.prototype.hasOwnProperty()和Object.prototype.isPropertyOf()先讲解hasOwnProperty()方法和使用.在讲解isPropertyOf()方法和使用 看懂这些至少要懂原型链 一.Object.prototype.hasOwnProperty() 概述 hasOwnProperty()方法用来判断

transport.js报hasOwnProperty对象不支持此属性

ECShop transport.js错误 这次出现的问题是transport.js在IE下提示对象不支持该用法.出现错误位置为608行的下面的代码: if(this.hasOwnProperty(k)){ 仔细看了一下代码,这个判断的主要作用应该是判断属性的.可能由于各浏览器的差异化,IE下就会出现不支持该用法的错误. 解决方法很简单,只要加多一个判断:if(this.hasOwnProperty&&this.hasOwnProperty(k)){ 就可以解决这个问题了. 究其原因在ie

JavaScript hasOwnProperty() 函数详解

hasOwnProperty()函数用于指示一个对象自身(不包括原型链)是否具有指定名称的属性.如果有,返回true,否则返回false. 该方法属于Object对象,由于所有的对象都"继承"了Object的对象实例,因此几乎所有的实例对象都可以使用该方法. IE 5.5+.FireFox.Chrome.Safari.Opera等主流浏览器均支持该函数. 语法 object.hasOwnProperty( propertyName ) propertyName:string类型,指定参

hasOwnProperty方法,检索ajax响应对象的存储

经常使用百度搜索的同学,一定不会忽视输入框的下拉索引,它是如此方便,然而得天独厚的条件使得这项异步技术多少面临些考验,高并发的服务端请求督促着他们的前端攻城师必须尽可能地减少发送ajax的次数.听起来似乎与本文无关,但并不是这样.首先就暂且让我们为百度免费做个广告吧.在百度首页输入“前端”一词,利用chromebug可以很轻松地看到所发送的响应,结果显示如下: window.bdsug.sug({q:'前端';,p:false,s:['前端开发','前端工程师','前端总线','前端开发工程师'

js中的hasOwnProperty和isPrototypeOf方法

转自:http://www.cnblogs.com/jenry/archive/2010/12/08/1900150.html hasOwnProperty:是用来判断一个对象是否有你给出名称的属性或对象.不过需要注意的是,此方法无法检查该对象的原型链中是否具有该属性,该属性必须是对象本身的一个成员. isPrototypeOf:是用来判断要检查其原型链的对象是否存在于指定对象实例中,是则返回true,否则返回false. 实例try: function siteAdmin(nickName,s

JS中isPrototypeOf 和hasOwnProperty 的区别 ------- js使用in和hasOwnProperty获取对象属性的区别

JS中isPrototypeOf 和hasOwnProperty 的区别 1.isPrototypeOf isPrototypeOf是用来判断指定对象object1是否存在于另一个对象object2的原型链中,是则返回true,否则返回false. 格式如下: object1.isPrototypeOf(object2); object1是一个对象的实例: object2是另一个将要检查其原型链的对象. 原型链可以用来在同一个对象类型的不同实例之间共享功能. 如果 object2 的原型链中包含

hasOwnProperty()

概述 hasOwnProperty() 方法用来判断某个对象是否含有指定的自身属性. 语法 obj.hasOwnProperty(prop) 参数 prop 要检测的属性名称. 描述 所有继承了 Object.prototype 的对象都会从原型链上继承到 hasOwnProperty 方法,这个方法可以用来检测一个对象是否含有特定的自身属性,和 in 运算符不同,该方法会忽略掉那些从原型链上继承到的属性.