HTML5技术

深入学习JavaScript对象 - clearbug(4)

字号+ 作者:H5之家 来源:博客园 2015-09-28 18:10 我要评论( )

相对于检测属性,我们更常用的是枚举属性。枚举属性我们通常使用for/in循环,它可以在循环体中遍历对象中所有可枚举的自有属性和继承属性,把属性名称赋值给循环变量。继续上实例: 我原来认为for/in循环跟in运算符

  相对于检测属性,我们更常用的是枚举属性。枚举属性我们通常使用for/in循环,它可以在循环体中遍历对象中所有可枚举的自有属性和继承属性,把属性名称赋值给循环变量。继续上实例:

 

  我原来认为for/in循环跟in运算符有莫大关系的,现在看来它们的规则并不相同啊!当然,如果这里不想遍历出继承的属性,那就在for/in循环中加一层hasOwnProperty()判断:

for(prop in obj){ if(obj.hasOwnProperty(prop)){ console.log(prop); } }

  除了for/in循环之外,ECMAScript 5还定义了两个可以枚举属性名称的函数:

    ①Object.getOwnpropertyNames(),它返回对象的所有自有属性的名称,不论是否可枚举;

    ②Object.keys(),它返回对象对象中可枚举的自有属性的名称;

  还是实例:

九.对象的三个特殊属性

  每个对象都有与之相关的原型(prototype)、类(class)和可扩展性(extensible attribute)。这三个就是对象的特殊属性(它们也只是对象的属性而已,并没有想象的复杂哦)。

1.原型属性

  正如前面所说,对象的原型属性是用来继承属性的(有点绕...),这个属性如此重要,以至于我们经常把“o的原型属性”直接叫做“o的原型”。原型属性是在实例创建之初就设置好的(也就是说,这个属性的值是JavaScript默认自动设置的,后面我们会说如何自己手动设置),前面也提到:

    ①通过对象直接量创建的对象使用Object.prototype作为它们的原型;

    ②通过new+构造函数创建的对象使用构造函数的prototype属性作为它们的原型;

    ③通过Object.create()创建的对象使用第一个参数(如果这个参数为null,则对象原型属性值为undefined;如果这个参数为undefined,则会报错:Uncaught TypeError: Object prototype may only be an Object or null: undefined)作为它们的原型;

  那么,如何查询一个对象的原型属性呢?在ECMAScript 5中,将对象作为参数传入Object.getPrototypeOf()可以查询它的原型,例如:

  

  但是在ECMAScript 3中,没有Object.getPrototypeOf()函数,但经常使用表达式obj.constructor.prototype来检测一个对象的原型,因为每个对象都有一个constructor属性表示这个对象的构造函数:

  ①通过对象直接量创建的对象的constructor属性指向构造函数Object();

  ②通过new+构造函数创建的对象的constructor属性指向构造函数;

  ③通过Object.create()创建的对象的constructor属性指向与其原型对象的constructor属性指向相同;

  要检测一个对象是否是另一个对象的原型(或处于原型链中),可以使用isPrototypeOf()方法。例如:

 

  还有一个非标准但众多浏览器都已实现的对象的属性__proto__(同样是两个下划线开始和结束,以表明其为非标准),用以直接查询/设置对象的原型。

2.类属性

  对象的类属性(class attribute)是一个字符串,用以表示对象的类型信息。ECMAScript 3 和ECMAScript 5 都未提供设置这个属性的方法,并只有一种间接的方法可以查询它。默认的toString()方法(继承自Object.prototype)返回了这种格式的字符串:[object class] 。因此,要想获得对象的类,可以调用对象的toString()方法,然后提取已返回字符串的第8到倒数第二个位置之间的字符。不过,很多对象继承的toString()方法重写了(比如:Array、Date等),为了能调用正确的toString()版本,必须间接地调用Function.call()方法。下面代码可以返回传递给它的任意对象的类:

 

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

相关文章
  • HTTP协议学习随笔 - 糖醋酸辣椒

    HTTP协议学习随笔 - 糖醋酸辣椒

    2017-05-01 18:03

  • 【react学习】关于react框架使用的一些细节要点的思考 - 外婆的彭湖湾

    【react学习】关于react框架使用的一些细节要点的思考 - 外婆的彭湖

    2017-04-16 18:00

  • 计算机网络——DNS协议的学习与实现 - 学数学的程序猿

    计算机网络——DNS协议的学习与实现 - 学数学的程序猿

    2017-04-16 10:00

  • ASP.NET Core MVC 源码学习:详解 Action 的激活 - Savorboard

    ASP.NET Core MVC 源码学习:详解 Action 的激活 - Savorboard

    2017-04-14 13:04

网友点评
w