JS 对象 Object

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:在读取属性时调用的函数,默认值为undefined
  • set:在写入属性时调用的函数,默认值为undefined

详情见 Object.create 章节。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值