对象是否拥有某个属性,in和for in以及object.hasOwnProperty('×××')的异同,以及Object.defineProperty(),Object.keys(),Object.getOwnPropertyNames()的用法

  1.在某个对象是否拥有某个属性,判断的方法有很多,常用的方法就是object.hasOwnProperty(‘××ב),这个方法是不包括对象原型链上的方法的,举个例子:

var obj = {
    name:‘fei‘
}
    console.log(obj.hasOwnProperty(‘name‘))//true
    console.log(obj.hasOwnProperty(‘toString‘))//false

在这个例子中,obj对象存在的name属性的时候,调用这个方法才是返回true,我们知道其实每个对象实例的原型链上存在toString方法,在这里打印false,说明这个方法只是表明实例对象的属性,不包括原型链上的属性。

  2.下面我们再来看看in的使用,例子如下:

var obj = {
     name:‘fei‘
}
    console.log(‘toString‘ in obj)//true

我们可以看到,其实在这个例子中,我只是给了对象一个属性name,并没有其他的属性,然后我执行‘tiString‘ in obj,可以看出控制动态打印出来的是true,原因就是对象的原型链上存在toString方法,所以in操作不管是不是原型链上,只要存在这个属性,返回的就是true。

  3.接着我们再看for in。在使用for in 循环的时候,其实返回的是能通过对象访问的,可枚举的,包括实例中的,也包括原型中的,例子如下

var obj = {
      name:‘fei‘,
      age:20,
      friend:["fei","jun","zhu"]
}
for( var i in obj){
      console.log(i)//会打印三次,name,age,friend
}

为什么上面没有打印原型中的属性呢,因为原型中的属性都默认设置了不可枚举(enumerated);我们将例子改成下面这样:

var obj = {
      name:‘fei‘,
      age:20,
      friend:["fei","jun","zhu"]
}
 Object.defineProperty(obj, ‘like‘, {//使用Object.defineProperty()方法可以设置你设置属性的特性
      enumerable:false,//设置不可枚举
      value:‘basketball‘//值为basketball
 })
console.log(obj)//Object {name: "fei", age: 20, friend: Array[3], like: "basketball"}

for(var i in obj){
     console.log(i)//依旧打印三个name,age,friend
}

从这个例子中可以看出,在给属性设置为不可枚举的时候,是不会出现在for in循环中的,这也造成IE低版本出现bug,就是不可枚举的属性不会出现在for in中,如果你从新定义了一个属性和原型的属性相同,那么这个属性也不会出现在for in中,现在的浏览器不会出现,例子如下:

var obj = {
        toString:function(){
               return "666"
        }
}
 for(var i in obj){
       if(i=="toString"){
              console.log(‘我出现了‘) //在低版本的IE中不显示
        }
}

4.要取得所有可枚举的对象,可以使用ECMAscript5的方法Object.keys(),接受一个对象为参数,返回所有可枚举的属性的字符串数组:

function People(){

}
People.prototype.say = function(){
        console.log(‘say‘)
}
People.prototype.name = "feifei";

var people = new People()
people.age = 12;

console.log(Object.keys(people))//[‘age‘]

这个方法并不会包含原型链中的属性,只是实例中的可枚举的属性。

5.获取实例中所有属性,无论是否可枚举,利用Object.getOwnPropertyNames(),以对象为参数,返回熟悉的数组。例子:

function People(){

}
People.prototype.say = function(){
      console.log(‘say‘)
}
People.prototype.name = "feifei";

var people = new People()
people.age = 12;
Object.defineProperty(people, ‘like‘, {//使用Object.defineProperty()方法可以设置你设置属性的特性
      enumerable:false,//设置不可枚举
      value:‘basketball‘//值为basketball
})
console.log(people)//People {age: 12, like: "basketball"}
console.log(Object.getOwnPropertyNames(people))//["age", "like"]

这个方法仅仅是返回实例中所有的属性,无论是不是可枚举的,不包括原型里面的属性。

  

对象是否拥有某个属性,in和for in以及object.hasOwnProperty('×××')的异同,以及Object.defineProperty(),Object.keys(),Object.getOwnPropertyNames()的用法

时间: 2024-08-25 11:14:15

对象是否拥有某个属性,in和for in以及object.hasOwnProperty('×××')的异同,以及Object.defineProperty(),Object.keys(),Object.getOwnPropertyNames()的用法的相关文章

判断JS对象是否拥有某属性

可以用 in操作符 和 对象的 hasOwnProperty 操作符 举例 "name" in Object Object.hasOwnProperty("name") 有个公共的方法 function hasPrototype(object,name){ return !object.hasOwnProperty(name)&&(name in object);}

jQuery基础(样式篇,DOM对象,选择器,属性样式)

1. $(document).ready 的作用是等页面的文档(document)中的节点都加载完毕后,再执行后续的代码,因为我们在执行代码的时候,可能会依赖页面的某一个元素,我们要确保这个元素真正的的被加载完毕后才能正确的使用. $(document).ready(function() {   内容  }); 1.jQuery对象与DOM对象   jQuery对象与DOM对象是不一样的 普通处理,通过标准JavaScript处理: var p = document.getElementById

判断对象是否有某个属性

/*下面是一个对比,看看在判断是否包括一个键上面,Object结构和Set结构的写法不同.*/ // 对象的写法 var myObject = { "mm": "m1", "height": 1, "width": 1 }; if(myObject["mm"]){ console.log(myObject["mm"]); // m1 } //最开始报错:mm is not defined

oc学习之对象作为类的属性

对象做为类的属性 1. 一个Target中的类无法直接在另外1个Target中访问. 2. 类的属性代表什么? a. 类的属性代表这类事物具有的共同的特征 b. 类的属性代表这个类所拥有的东西. 灯: 属性: 形状 功率 价格  品牌 剩余寿命 方法: 照明. 音响: 方法: 发声音. 门: 属性: 尺寸 材料 颜色 价格 方法: 开 关 3. 类的方法代表什么? a. 代表这个类所具备的行为. 这个类所具备的功能. b. 一个类有什么方法 就去分析这个类有什么功能. 4. 属性的本质是变量.

关于对象、类、属性和方法的理解

文章开头申明:半路出家的野路子,可能个人理解有所欠缺,希望不吝赐教. 在初步学习java的过程中,往往都是绕不开面向对象的思想,说到对象或许挺多初学者和我一样只是听说过一个"万物皆对象"的说法,简单的记下对象包含属性和方法,然而实际使用的过程中往往有忽略这些东西,也就是犯浑了.个人的理解是希望将对象.类.属性和方法用一个例子来简单说明. 打个比方说我到商场买手机这个例子吧.我到了商场买手机,第一步自然就是向售货员提出我的要求:如手机大小.CPU.内存等等(属性),要求能拍照打电话首发短

SQL SERVER 属性OWNER不可用于数据库xxx。该对象可能没有此属性,也可能是访问权限不足而无法检索。

今天遇到一个案例:右键单击数据库的属性时出现下面错误提示: 属性Owner不可用于数据库xxx,该对象可能没有此属性,也可能是访问权限不足而无法检索. 使用脚本查看该数据库的Owner时发现Owner为null.具体原因是因为该数据库的Owner是一个系统管理员的账号,由于该同事离职,接手的系统管理员将该账号清除了,所以出现上面错误.此时用下面脚本查询,就会发现该Owner为null值. SELECT  d.name ,         owner_sid ,         l.name FR

对象不支持ajax属性或方法

今天在做泛微流程开发的时候,遇到一件很奇怪的事情,流程流转到第二个节点,居然报错了,提示”对象不支持ajax属性和方法“,但是第一个节点测试并未报错了, /(ㄒoㄒ)/~~,然后试着把jQuery的简写“$"改成”JQuery“后,不在提示”对象不支持ajax属性和方法“错误,而是变成了“automation服务器不能创建对象”问题,看下了错误的代码 行”var xhr = window.ActiveXObject ? new ActiveXObject("Microsoft.XMLH

判断JavaScript对象为null或者属性为空

http://blog.csdn.net/yiluoak_47/article/details/7766760 首先说下null与undefined区别: 对已声明但未初始化的和未声明的变量执行typeof,都返回"undefined". null表示一个空对象指针,typeof操作会返回"object". 一般不显式的把变量的值设置为undefined,但null相反,对于将要保存对象的变量,应明确的让该变量保存null值. 1 var bj; 2 alert(b

类对象可直接访问属性,但未实例化不能调用方法

>>> class MyClass: name = 'FishC' def mufun(self): print('hello Fishc!') >>> MyClass.name#类对象对类的属性进行直接访问 'FishC' >>> MyClass.mufun()#但是类没有实例化,访问其中的方法,则成为不可能. Traceback (most recent call last): File "<pyshell#18>"