ES5的常用对象方法详解

ECMAScript 5 为 JavaScript 添加了大量新的对象方法,如下

阅读目录

  • Object.defineProperty(object, property, descriptor) // 添加或更改对象属性
  • Object.defineProperties(object, descriptors) // 添加或更改多个对象属性
  • Object.keys(object) // 以数组返回所有可枚举的属性
  • Object.freeze(object) // 防止对对象进行任何更改
  • Object.isFrozen(object) // 如果对象被冻结,则返回 true
  • Object.getOwnPropertyDescriptor(object, property) // 访问属性
  • Object.getOwnPropertyNames(object) // 以数组返回所有属性

讲述下列对象方法之前,有必要先了解下对象属性相关的方法,有利于更能深刻的熟悉对象方法

对象属性描述符

概念:两种主要形式分贝为数据描述符和存取描述符;

数据描述符--是一个具有值的属性,该值可能是可写的,也可能不是可写的,包括configurable,enumerable,writable,value;

存取描述符--是由getter-setter函数对描述的属性,包括get和set方法,可以代替value和writable

     注:属性描述符”对象只能在Object.defineProperty或Object.defineProperties中使用。

Object.defineProperty(object, property, descriptor)

概念:用于在一个对象上定义一个新的属性,或者修改一个对象现有的属性,并返回这个对象

特点:使用Object.defineProperty()定义的属性,默认是不可以被修改,不可以被枚举,不可以被删除的,参考案例1;若要修改对象的属性,需要通过设置属性描述符可修改成功,参考案例2;

注:设置set或者get,就不能在设置value和wriable,否则会报错,参考案例3

案例1:

var obj = {};
Object.defineProperty(obj, ‘name‘, {
value: ‘definePropertyTest‘
});
console.log(‘obj默认值:‘, obj);
delete obj.name;
console.log(‘obj删除后:‘, obj);
console.log(‘obj枚举:‘, Object.keys(obj));
obj.name = ‘definePropertyTest1‘;
console.log(‘obj修改后:‘, obj);
      

输出结果

案例2:

var obj = {};
Object.defineProperty(obj, ‘name‘, {
value: ‘definePropertyTest‘,
writable: true,       // 可以被修改
enumerable: true,     // 可以被枚举
configurable: true,   // 可以被删除
});
console.log(‘obj默认值:‘, obj);
console.log(‘obj枚举:‘, Object.keys(obj));
obj.name = ‘definePropertyTest1‘;
console.log(‘obj修改后:‘, obj);
delete obj.name;
console.log(‘obj删除后:‘, obj);

输出结果

案例3:

var obj = {};
Object.defineProperty(obj, ‘name‘, {
// value: ‘definePropertyTest‘,
// writable: true, 放开注释则会报Invalid property descriptor. Cannot both specify accessors and a value or writable attribute
enumerable: true,
configurable: true,
get: function () {
  console.log(‘get‘, this);
  return ‘name ‘ + this.__name;
},
set: function (newVal) {
      localStorage.setItem(‘name‘, newVal);
      console.log(‘set‘, newVal);
      this.__name = newVal;
}
});
console.log(‘obj默认值:‘, obj);
obj.name = ‘definePropertyTest‘;
console.log(‘obj枚举:‘, Object.keys(obj));
delete obj.name;
console.log(‘obj删除后:‘, obj); 

输出结果

Object.defineProperties(object, descriptors)

概念:在对象上定义多个新的属性或者修改多个原有属性,返回修改后的目标对象

特点:与Object.defineProperties()方法相同,区别为可以对多个属性进行定义和修改

案例:

var obj = {};
Object.defineProperties(obj, {
    name:{
        enumerable: true,
        configurable: true,
        get: function () {
          return this.__name;
        },
        set: function (newVal) {
              this.__name = ‘definePropertyTest‘;
        }
    },
    age:{
        enumerable: true,
        configurable: true,
        get: function () {
          return this.__age;
        },
        set: function (newVal) {
              this.__age = ‘18‘;
        }
    },

});
console.log(‘obj默认值:‘, obj);
console.log(‘obj枚举:‘, Object.keys(obj));
obj.name = ‘definePropertyTest1‘;
obj.age = 19;
console.log(‘修改后:‘, obj); //set方法进行了拦截,无法修改
delete obj.name;
delete obj.age;
console.log(‘obj删除后:‘, obj); //无法删除

输出结果

Object.keys(object)

概念:返回对象的可枚举属性和方法,返回类型为数组,数组中属性名的排列顺序和使用 for...in 循环遍历该对象时返回的顺序一致

注:在ES5里,如果此方法的参数不是对象(而是一个原始值),那么它会抛出 TypeError。在ES2015中,非对象的参数将被强制转换为一个对象

案例:

var obj = {
    key1:1,key2:2
}
console.log(Object.keys(obj)) //[‘key1‘,‘key2‘]
//传入数组或字符串,返回索引
var arr = [‘key1‘,‘key2‘];
var string = "key";
console.log(Object.keys(arr)) //["0","1"]
console.log(Object.keys(string)) //["0","1","2"]
//传入构造函数 返回空数组或者属性名
function TestObjectKey(name,age){
    this.name = name;
    this.age = age;
    this.toString = function(){
        return ‘toString‘;
    }
}
console.log(Object.keys(TestObjectKey)); //[]
var key = new TestObjectKey("key1",18);
console.log(Object.keys(key)); // ["name", "age", "toString"]

Object.freeze(object)

概念:冻结一个对象,返回和传入的参数相同的对象

特点:冻结的对象不能被修改,不能向对象添加新的属性,不能删除已有属性,不能修改属性的性质包括可枚举性、可配置性、可写性、以及不能修改已有属性的值,该对象的原型也不能修改

注:冻结对象不是常量对象(浅冻结)

案例:

const obj1 = {
    name:"freeze1"
}
Object.freeze(obj1);
const obj2 = Object.freeze(obj1);
console.log(obj1===obj2); //true 返回原来的对象
obj1.name = "freeze1";
console.log(obj1); //{name:"freeze1"} 冻结的对象不可更改
delete obj1.name
console.log(obj1); //{name:"freeze1"} 冻结的对象不可删除
obj1.age = 18;
console.log(obj1) //{name:"freeze1"} 冻结的对象不可添加属性
const obj3 = {
    internal:{}
}
Object.freeze(obj3);
obj3.internal.name = "freeze3";
console.log(obj3) //{internal:{name:freeze3}} 冻结的对象不是常量对象-浅冻结
var arr = ["freeze"];
Object.freeze(arr);
arr[1] = "freeze1";
console.log(arr) //冻结的数组不能修改,其它同对象

Object.isFrozen(object)

概念:返回给定对象是否冻结的Boolean

特点:一个对象默认是非冻结的,冻结的对象不可扩展,不可配置

案例:

var obj = {};
console.log(Object.isFrozen(obj)); //空对象默认是非冻结的
var obj1 = {
    name:‘isFrozen‘
}
console.log(Object.isFrozen(obj1)); //非空对象默认是非冻结的
var obj2 = Object.freeze(obj);
console.log(Object.isFrozen(obj)); //true 冻结对象是冻结的
console.log(Object.isFrozen(obj2)); //true 冻结对象的拷贝也是冻结的

Object.getOwnPropertyDescriptor(object, property)

概念:返回指定对象上一个自有属性对应的属性描述符

案例:

var obj = {name:"getOwnPropertyDescriptor"}
Object.getOwnPropertyDescriptor(obj,"name");
// {
//   value: "getOwnPropertyDescriptor",
//   writable: true,
//   enumerable: true
//   configurable:true
// }
var obj1 = {};
Object.defineProperty(obj1, "name", {
  value: "getOwnPropertyDescriptor",
  writable: false,
  enumerable: false
});
Object.getOwnPropertyDescriptor(obj1, "name");
// {
//   value: "getOwnPropertyDescriptor",
//   writable: false,
//   enumerable: false,
//   configurable:false
// }

Object.getOwnPropertyNames(object)

概念:返回一个由指定对象的所有自身属性的属性名组成的数组

案例:

var obj = {};
Object.getOwnPropertyNames(obj); //[]
var arr = ["a","b","c"];
Object.getOwnPropertyNames(arr); //["0", "1", "2", "length"]

参考网站
https://segmentfault.com/a/1190000019446677

原文地址:https://www.cnblogs.com/zhangyaolan/p/11238400.html

时间: 2024-08-01 11:05:43

ES5的常用对象方法详解的相关文章

Python:file/file-like对象方法详解【单个文件读写】

IO中读写文件操作方法汇总!----The_Third_Wave的学习笔记! 本文由@The_Third_Wave(Blog地址:http://blog.csdn.net/zhanh1218)原创.不定期更新,有错误请指正. Sina微博关注:@The_Third_Wave 如果这篇博文对您有帮助,为了好的网络环境,不建议转载,建议收藏!如果您一定要转载,请带上后缀和本文地址. class file(object) |  file(name[, mode[, buffering]]) -> fi

js中Array对象方法详解

操作方法:concat() slice() splice() concat()方法可以基于当前数组中的所有项创建一个新数组.具体来说,这个方法会创建当前数组一个副本,将接收到参数添加到副本的末尾,最后返回新构建的数组.如果没有参数,复制当前数组并返回副本.如果参数是一个或多个数组,会将数组中的每一项添加到结果数组中.如果参数不是数组,将参数值添加到数组末尾. var colors = ['red','green','blue']; var colors2 = colors.concat('yel

86.QuerySet API常用的方法详解:get方法

get方法的查询条件只能有一条数据满足,如果匹配到多条数据都满足,就会报错:如果没有匹配到满足条件的数据,也会报错. 示例代码如下: from django.http import HttpResponse from django.db import connection from .models import Book def index(request): book = Book.objects.get(pk=3) # 而不能是 # book = Book.objects.get(id__g

Delphi中TStringList类常用属性方法详解

//TStringList 常用方法与属性: var List: TStringList; i: Integer; begin List := TStringList.Create; List.Add('Strings1');           {添加} List.Add('Strings2'); List.Exchange(0,1);             {置换} List.Insert(0,'Strings3');      {插入} i := List.IndexOf('String

JavaScript原生对象属性和方法详解——Array对象 转载

length 设置或返回 数组中元素的数目. 注意:设置 length 属性可改变数组的大小.如果设置的值比其当前值小,数组将被截断,其尾部的元素将丢失.如果设置的值比它的当前值大,数组将增大,新的元素被添加到数组的尾部,它们的值为 undefined.所以length不一定代表数组的元素个数. var arr = new Array(3) arr[0] = "John" arr[1] = "Andy" arr[2] = "Wendy" cons

Jquery遍历筛选数组的几种方法和遍历解析json对象|Map()方法详解

一.Jquery遍历筛选数组 1.jquery grep()筛选遍历数组 $().ready( function(){ var array = [1,2,3,4,5,6,7,8,9]; var filterarray = $.grep(array,function(value){ return value > 5;//筛选出大于5的 }); for(var i=0;i<filterarray.length;i++){ alert(filterarray[i]); } for (key in f

Python数据类型及其方法详解

Python数据类型及其方法详解 我们在学习编程语言的时候,都会遇到数据类型,这种看着很基础也不显眼的东西,却是很重要,本文介绍了python的数据类型,并就每种数据类型的方法作出了详细的描述,可供知识回顾. 一.整型和长整型 整型:数据是不包含小数部分的数值型数据,比如我们所说的1.2.3.4.122,其type为"int" 长整型:也是一种数字型数据,但是一般数字很大,其type为"long" 在python2中区分整型和长整型,在32位的机器上,取值范围是-2

HTTP请求方法详解

HTTP请求方法详解 请求方法:指定了客户端想对指定的资源/服务器作何种操作 下面我们介绍HTTP/1.1中可用的请求方法: [GET:获取资源]     GET方法用来请求已被URI识别的资源.指定的资源经服务器端解析后返回响应内容(也就是说,如果请求的资源是文本,那就保持原样返回:如果是CGI[通用网关接口]那样的程序,则返回经过执行后的输出结果).     最常用于向服务器查询某些信息.必要时,可以将查询字符串参数追加到URL末尾,以便将信息发送给服务器.     使用GET请求时经常会发

JqGrid 使用方法详解

JQGrid JQGrid是一个在jquery基础上做的一个表格控件,以ajax的方式和服务器端通信. JQGrid Demo 是一个在线的演示项目.在这里,可以知道jqgrid可以做什么事情. 下面是转自其他人blog的一个学习资料,与其说是学习资料,说成查询帮助文档更加合适. jqGrid学习之 ------------- 安装 jqGrid安装很简单,只需把相应的css.js文件加入到页面中即可. 按照官网文档: /myproject/css/ ui.jqgrid.css