JS对象随笔

JS中的对象

JS中对象(若无特殊说明,本文中的对象都为对象实例,即便是空对象实例)可谓是一个核心的概念,纵观整个JS的数据结构如StringNumberArrayBoolean等,都有其对应的对象。细细数来,感受上就是JS里一切数据皆对象(除了纯数字、nullundefined外,其余数据均可以访问到__proto__属性)。本文将浅析一下JS中的对象及相关概念。浏览器

对象的属性

JS中的对象本质上就是一个若干个无序的键值对组成的集合。每一个键值对就是对象的属性或方法。而对象中的每一个属性都对应着有属性描述符,属性描述符分为数据描述符和存储描述符。属性描述符又包含了如下几个属性。数据结构

数据描述符和存取描述符均具备如下可选键值:函数

configurable
当且仅当该属性的 configurable 为 true 时,该属性描述符才可以被改变,也可以被删除。默认为 false。
enumerable
当且仅当该属性的 enumerable 为 true 时,该属性才可以出如今对象的枚举属性中。默认为 false。
数据描述符同时具备如下可选键值:性能

value
该属性对应的值。能够是任何有效的 JavaScript 值(数值,对象,函数等)。默认为 undefined。
writable
当且仅当该属性的 writable 为 true 时,该属性才能被赋值运算符改变。默认为 false。
存取描述符同时具备如下可选键值:prototype

get
一个给属性提供 getter 的方法,若是没有 getter 则为 undefined。该方法返回值被用做属性值。默认为 >undefined。
set
一个给属性提供 setter 的方法,若是没有 setter 则为 undefined。该方法将接受惟一参数,并将该参数的新值>分配给该属性。默认为 undefined。code

对象的属性和方法中有几个特殊的存在:对象

  • constructor继承

    该属性指向对象的构造函数ip

  • __proto__(非标准,不推荐使用)原型链

    该属性指向对象的构造函数的原型对象,由于对象没有prototype属性,因此经过该属性指向它。此属性为访问器属性,不推荐使用。若须要获取对象的原型对象能够用Object.getPrototypeOf(obj)来获取。

经过对象访问的属性和方法除了来自对象自身定义的之外,还有从其原型链上继承的属性和方法。

原型对象

对象的原型对象实质上是对象的构造函数的原型对象。能够用Object.setPrototypeOf(obj,prototype)改变对象的原型对象。
访问对象的原型对象有两种方法,一是经过内置属性 __proto__访问,二是经过Object方法Object.getPrototypeOf(obj)访问。两种方法都有其局限性,第一种方法不是ES标准所支持的,虽然ES6已经支持了。由于__proto__属性时访问器属性,因此能够修改对象的原型对象(这样很影响性能)。第二种方法在IE浏览器中的支持状况是IE9+。整体上讲,推荐第二种方法去访问对象的原型对象。若是想要替换原型对象,则可用 Object.setPrototypeOf(obj,prototype)从新设置其原型对象。

构造函数

全部的对象都是经过构造函数实例化出来的。Object也不例外。
对象的构造函数恒等于实例出该对象的构造函数的原型对象的constructor属性指向的函数。即

var obj = new A(); 
obj.constructor===A.prototype.constructor

一个对象,若是沿着原型链找下去,最终都会找到Object构造函数、原型对象相互之间纠缠不休,你中有我,我中有你。

相关文章
相关标签/搜索