Object 是一个构造函数,当然他也是一个对象。ECMAScript 中的所有对象都由这个对象继承而来,Object 对象中的所有属性和方法都会出现在其他对象中。
创建实例对象
var obj1 = { a:1, b:2 }; //1.字面量语法,内部自动调用了 new Object()
var obj2 = Object({a:1,b:2}); //2.构造函数语法
var obj3 = new Object({a:1,b:2}); //3.实例化一个对象
console.log(obj1); //{a:1,b:2}
console.log(obj2); //{a:1,b:2}
console.log(obj3); //{a:1,b:2}
JavaScript 中万物皆对象,因为它们都是由 Object 继承而来。
Object 对象的属性和方法
这些属性和方法都可以被 Object 子孙实例继承。
属性和方法 | 描述 |
---|---|
constructor | 指向它的构造函数。 |
prototype | 对该对象的对象原型的引用。 |
__proto__ | 指向它的原型。 |
hasOwnProperty(property) | 判断对象是否具有某个属性(非继承属性)。 |
isPrototypeOf(object) | 判断该对象是否为另一个对象的原型。 |
propertyIsEnumerable() | 判断给定的属性(非继承属性)是否可以用 for…in 语句进行枚举。 |
toString() | 返回对象的原始字符串表示。 |
valueOf() | 返回最适合该对象的原始值。大多数对象返回值与 ToString() 相同。 |
//在原型上添加属性 aaa, 改属性同样会被 Object 的子孙实例继承
Object.prototype.aaa = "abc";
//在JS中万物皆对象,所以下列数据类型都是对象,都会继承原型上的属性和方法(除了null和undefined)
var obj = { a:1, b:2 }; //对象数据
console.log(obj.aaa); //abc
var s = "word"; //字符串
console.log(s.aaa); //abc
var n = 12; //数字
console.log(n.aaa); //abc
var arr = [1,2]; //数组
console.log(arr.aaa); //abc
var bool = true; //布尔值
console.log(bool.aaa); //abc
var fn = function(){}; //函数
console.log(fn.aaa); //abc
//指向构造函数
obj.constructor === Object //true
s.constructor === String //true
n.constructor === Number //true
arr.constructor === Array //true
bool.constructor === Boolean //true
fn.constructor === Function //true
//指向原型对象
obj.__proto__ === Object.prototype //true
s.__proto__ === String.prototype //true
n.__proto__ === Number.prototype //true
arr.__proto__ === Array.prototype //true
bool.__proto__ === Boolean.prototype //true
fn.__proto__ === Function.prototype //true
//是否包含某个属性(非继承属性)
obj.hasOwnProperty('b'); //true obj是否包含b属性
obj.hasOwnProperty('aaa'); //false 继承的属性不算
//判断是否是对象的原型
Object.prototype.isPrototypeOf(obj); //true obj 的原型是 Object.prototype
//属性是否可枚举(非继承属性)
obj.propertyIsEnumerable('b'); //true b是可枚举的属性
obj.propertyIsEnumerable('aaa'); //false 继承的属性不算
//其他
obj.toString(); //[object Object]
obj.valueOf(); //{a: 1, b: 2}
关于__proto__
属性
Object.prototype 的 __proto__
(前后各两个下划线)属性是一个访问器属性(一个getter函数和一个setter函数)。用来读取或设置当前对象的prototype对象。目前,所有浏览器(包括 IE11)都部署了这个属性。
__proto__
属性没有写入 ES6 的正文,而是写入了附录,原因是__proto__
前后的双下划线,说明它本质上是一个内部属性,而不是一个正式的对外的 API,只是由于浏览器广泛支持,才被加入了 ES6。只有浏览器必须部署这个属性,其他运行环境不一定需要部署,而且新的代码最好认为这个属性是不存在的。因此,无论从语义的角度,还是从兼容性的角度,都不要使用这个属性,而是使用下面的方法代替
Object.getPrototypeOf
/Reflect.getPrototypeOf
访问原型Object.setPrototypeOf
/Reflect.setPrototypeOf
设置原型
设置对象的原型比较消耗性能,应该避免。创建一个新的且可以继承原型的对象,推荐使用 Object.create()
。
Object 静态方法
以下方法属于 Object 静态方法,都需要用 Object 来调用。
方法 | 描述 |
---|---|
Object.create(proto,prop) | 创建一个新对象,使用现有的对象来提供新创建对象的原型对象。 |
Object.defineProperties(obj,props) | 直接在一个对象上定义新的属性或修改现有属性,并返回该对象。 |
Object.defineProperty(obj,prop,des) | 直接在一个对象上定义新的属性或修改现有属性(精准),并返回该对象。 |
Object.freeze(obj) | 冻结对象(包含数组)。 |
Object.getOwnPropertyDescriptor() | 返回指定对象上一个自有属性对应的属性描述符。 |
Object.getOwnPropertyDescriptors() | (ES6)返回一个对象的所有自身属性的描述符。 |
Object.getOwnPropertyNames(obj) | 返回对象的所有自身属性的属性名(不包括Symbol值作为名称的属性)组成的数组。 |
Object.getOwnPropertySymbols(obj) | 返回一个给定对象自身的所有 Symbol 属性的数组。 |
Object.isExtensible(obj) | 判断一个对象是否是可扩展的(是否可以在它上面添加新的属性)。 |
Object.isFrozen(obj) | 判断一个对象是否被冻结。 |
Object.isSealed(obj) | 判断一个对象是否被密封。 |
Object.preventExtensions(obj) | 让一个对象变的不可扩展,也就是永远不能再添加新的属。 |
Object.seal(obj) | 封闭一个对象,阻止添加新属性并将所有现有属性标记为不可配置。 |
Object.keys(obj) | 返回所有属性(非继承,可枚举的属性)的键名。 |
Object.values(obj) | (ES6)返回所有属性(非继承,可枚举的属性)的键值。 |
Object.entries(obj) | (ES6)返回所有属性(非继承,可枚举的属性)的的键值对数组。 |
Object.fromEntries(arr) | (ES6)是Object.entries()的逆操作,用于将一个键值对数组转为对象。 |
Object.assign(target,s1,s2,…) | (ES6)对象的合并,将源对象 s1,s2,… 的所有可枚举属性,复制到目标对象 target。 |
Object.is(v1,v2) | (ES6)比较两个值是否严格相等,与严格比较运算符(===)的行为基本一致。 |
Object.setPrototypeOf(obj,pro) | (ES6)设置一个对象的原型对象,返回参数对象本身。 |
Object.getPrototypeOf(o) | (ES6)读取一个对象的原型对象,返回该对象的原型对象。 |
JavaScript中的数据属性和访问器属性
在javaScript中,对象的属性分为两种类型:数据属性
和 访问器属性
。
数据属性
它包含的是一个数据值的位置,在这可以对数据值进行读写。
属性描述符:
configurable
:表示能否通过delete删除属性从而重新定义属性,能否修改属性的特性,或能否把属性修改为访问器属性enumerable
:表示能否通过for-in循环返回属性(能否枚举)writable
:表示能否修改属性的值value
:包含该属性的数据值。默认为undefined
访问器属性
包含的是一对get和set方法,在读写访问器属性时,就是通过这两个方法来进行操作处理的。
属性描述符:
configurable
:表示能否通过delete删除属性从而重新定义属性,能否修改属性的特性,或能否把属性修改为访问器属性enumerable
:表示能否通过for-in循环返回属性(能否枚举)get
:在读取属性时调用的函数,默认值为undefinedset
:在写入属性时调用的函数,默认值为undefined
详情见 Object.create 章节。