原生JS:Object对象详细参考
Object对象详细参考
本文参考MDN做的详细整理,方便大家参考MDN
JavaScript原生提供一个Object对象(注意起首的O是大写),所有其他对象都继承自这个对象。
构造函数:
Object 构造函数为给定的值创建一个对象包装。
如果给定值是 null or undefined,将会创建并返回一个空对象
否则,将返回一个与给定值对应类型的对象。
当以非构造函数形式被调用时,Object() 等同于 new Object()。
var o1 = new Object();//创建空对象,等同:var o1 = {};
Object()方法:
Object本身当作工具方法使用时,可以将任意值转为对象。如果参数是原始类型的值,Object方法返回对应的包装对象的实例。
Object() // 返回一个空对象
Object(undefined) // 返回一个空对象
Object(null) // 返回一个空对象
Object('foo') instanceof String // true
Object(o1) === o1// true 如果Object方法的参数是一个对象,它总是返回原对象
if( obj === Object(obj) ) //这个方法常用于判断某个值是否是对象。
属性:
Object.length 值为1。
Object.prototype 可以为所有 Object 类型的对象添加属性。
属性描述符:本文最后又详细说明
Object 对象的静态方法:
所谓“静态方法”,是指部署在对象自身的方法。在 ES5 中,如果参数不是一个对象类型,将抛出一个 TypeError 异常。在 ES6 中, non-object 参数将被视为一个不可扩展的普通对象,因此会返回 false 。
常用方法:
1)对象属性模型的相关方法
Object.getOwnPropertyDescriptor():获取某个属性的attributes对象。
Object.defineProperty():通过attributes对象,定义某个属性。
Object.defineProperties():通过attributes对象,定义多个属性。
Object.getOwnPropertyNames():返回直接定义在某个对象上面的全部属性的名称。
(2)控制对象状态的方法
Object.preventExtensions():防止对象扩展。
Object.isExtensible():判断对象是否可扩展。
Object.seal():禁止对象配置。
Object.isSealed():判断一个对象是否可配置。
Object.freeze():冻结一个对象。
Object.isFrozen():判断一个对象是否被冻结。
(3)原型链相关方法
Object.create():生成一个新对象,并该对象的原型。
Object.getPrototypeOf():获取对象的Prototype对象。
Object.assign(target, ...sources) IE不支持
把任意多个的源对象sources自身的可枚举属性浅拷贝给目标对象,然后返回目标对象target,若属性名重复则抛出异常打断接下来的拷贝任务,Object.assign 会跳过那些值为 null 或 undefined 的源对象。
Object.create(proto, [ propertiesObject ]) IE9
创建一个拥有指定的原型对象proto和可选的属性描述符对象propertiesObject
如果 proto 参数不是 null 或一个对象值,则抛出一个 TypeError 异常。
属性描述符对象propertiesObject不能是 undefined,另外只有该对象中自有的可枚举的属性才有效,也就是说该对象的原型链上属性是无效的。
//创建一个以另一个空对象为原型,且拥有一个可写的,可枚举的,不可配置的属性p,省略了的属性特性默认为false
var o2 = Object.create({}, { p: { value: 42, writable: true, enumerable: true } });
Object.defineProperty(obj, property, descriptor) IE9(IE8部分支持)
精确地给对象obj添加或修改一个自有属性property,详细指定该属性的配置对象descriptor,最后返回这个对象obj。
一般情况下,我们为对象添加属性是通过赋值来创建并显示在属性枚举中(for...in 或 Object.keys 方法), 但这种方式添加的属性值可以被改变,也可以被删除。
而使用 Object.defineProperty() 则允许改变这些额外细节的默认设置。例如,默认情况下,使用 Object.defineProperty() 增加的属性值是不可改变的。
Object.defineProperties(obj, props) IE9
在一个对象obj上添加或修改一个或者多个自有属性,并分别指定它们的配置。返回该对象。参数props是该对象的一个或多个键值对,值为将要为对象添加或修改的属性的具体配置
Object.getOwnPropertyDescriptor(obj, prop) IE8
返回指定对象obj上一个自有属性对应的属性描述符对象prop。否则返回 undefined
Object.keys() IE9
返回一个数组,包含指定对象的所有自有可枚举的属性的名称。
Object.getOwnPropertyNames(obj) IE9
返回一个包含了指定对象所有自有的属性名的数组(包含不可枚举的属性)。
该数组中枚举属性的顺序与通过 for...in loop(或 Object.keys)迭代该对象属性时一致,而数组中不可枚举属性的顺序未定义。
Object.getOwnPropertySymbols(obj) ES6
返回一个数组,它包含了指定对象自身所有的符号属性(symbol 属性键)。
Object.getPrototypeOf(obj) IE9
返回指定对象obj的原型对象obj.prototype。
Object.is(value1, value2) IE Safari 无
判断两个值是否严格相等。(类似===运算符,但+0不等于-0,NaN等于自己)。
Object.freeze(obj) IE9
冻结对象:冻结对象obj的所有自身属性都不可能以任何方式被修改(不管是数据属性还是访问器属性)。任何尝试修改该对象的操作都会失败,可能是静默失败,也可能会抛出异常(严格模式中)。如果一个属性的值是个对象,则这个对象中的属性是可以修改的,除非它也是个冻结对象。
Object.isFrozen() IE9 ,但Opera无
判断对象是否已经冻结。一个对象是冻结的(frozen)是指它不可扩展,所有属性都是不可配置的(non-configurable),且所有数据属性(data properties)都是不可写的(non-writable)
Object.isSealed() IE9 ,但Opera无
判断对象是否已经密封。密封对象是指那些不可 扩展 的,且所有自身属性都不可配置的(non-configurable)且属性不可删除的对象(其可以是可写的)。
Object.isExtensible(obj) IE9
判断对象是否可扩展(是否可以在它上面添加新的属性)。Object.preventExtensions,Object.seal 或 Object.freeze 方法都可以标记一个对象为不可扩展。
Object.preventExtensions(obj) IE9 ,但Opera无
让一个对象变的不可扩展,也就是永远不能再添加新的属性。
不可扩展的对象的属性通常仍然可以被删除。
尝试给一个不可扩展对象添加新属性的操作将会失败,不过可能是静默失败,也可能会抛出 TypeError 异常(严格模式)。
Object.preventExtensions 只能阻止一个对象不能再添加新的自身属性,仍然可以为该对象的原型添加属性。
Object.seal() IE9 ,但Opera无
密封对象以防属性被删除,不会影响从原型链上继承的属性。但自身的__proto__属性的值也会不能修改。返回被密封后的对象。密封对象是指那些不能添加新的属性,不能删除已有属性,以及不能修改已有属性的可枚举性、可配置性、可写性,但可能可以修改已有属性的值的对象
Object.setPrototypeOf(obj, prototype) ES6 IE11 但Safari无
将一个指定的对象的原型设置为另一个对象或者null(既对象的[[Prototype]]内部属性)。如果对象的[[Prototype]]被修改成不可扩展,就会抛出 TypeError异常。如果prototype参数不是一个对象或者null(例如,数字,字符串,boolean,或者 undefined),则什么都不做。否则,该方法将obj的[[Prototype]]修改为新的值。
Object.values() ES7
返回一个包含指定对象所有的可枚举属性值的数组
Object对象的实例属性:
所有对象都会从它的原型上继承一个 constructor 属性
Object.prototype.constructor
返回一个指向创建了该对象原型的函数引用。需要注意的是,该属性的值是那个函数本身,而不是一个包含函数名称的字符串。
Object对象的实例方法:
部署在Object.prototype对象上的,所有Object的实例对象都继承了这些方法
Object.prototype.hasOwnProperty()
返回一个布尔值 ,用来判断某个对象是否含有指定的自身属性。和 in 运算符不同,该方法会忽略掉那些从原型链上继承到的属性。
Object.prototype.isPrototypeOf(obj)
返回一个布尔值,检测指定对象obj是否在本对象的原型链中。
Object.prototype.propertyIsEnumerable(propty)
判断指定属性是否可枚举。每个对象都有 propertyIsEnumerable 方法。该方法可以判断出指定对象里的属性是否可枚举,也就是说该属性是否可以通过 for...in 循环等遍历到,不过继承的可枚举属性可以通过 for...in 循环遍历到,所以对于继承属性该方法会返回false。如果对象没有指定的属性,该方法返回 false。
Object.prototype.toLocaleString()
直接调用 toString()方法。覆盖了 toLocaleString() 方法的对象:
Array: Array.prototype.toLocaleString()
Number: Number.prototype.toLocaleString()
Date: Date.prototype.toLocaleString()
Object.prototype.toString()
返回对象的字符串表示。
Object.prototype.valueOf()
返回指定对象的原始值。
不同数据类型的Object.prototype.toString方法返回值如下:
数值:返回[object Number]。
字符串:返回[object String]。
布尔值:返回[object Boolean]。
undefined:返回[object Undefined]。
null:返回[object Null]。
数组:返回[object Array]。
arguments对象:返回[object Arguments]。
函数:返回[object Function]。
Error对象:返回[object Error]。
Date对象:返回[object Date]。
RegExp对象:返回[object RegExp]。
其他对象:返回[object " + 构造函数的名称 + "]。
也就是说,Object.prototype.toString可以得到一个实例对象的构造函数
利用这个特性,可以写出一个比typeof运算符更准确的类型判断函数:
var type = function (o){
var s = Object.prototype.toString.call(o);
return s.match(/\\[object (.*?)\\]/)[1].toLowerCase();
};
type({}); // "object"
type([]); // "array"
type(5); // "number"
type(null); // "null"
type(); // "undefined"
type(/abcd/); // "regex"
type(new Date()); // "date"
在上面这个type函数的基础上,还可以加上专门判断某种类型数据的方法:
['Null',
'Undefined',
'Object',
'Array',
'String',
'Number',
'Boolean',
'Function',
'RegExp',
'NaN',
'Infinite'
].forEach(function (t) {
type['is' + t] = function (o) {
return type(o) === t.toLowerCase();
};
});
type.isObject({}) // true
type.isNumber(NaN) // true
type.isRegExp(/abc/) // true
属性描述符:
在 Javascript 中, 属性 由一个字符串类型的“名字”(name)和一个“属性描述符”(property descriptor)对象构成。
描述符必须是两种形式之一:数据描述符和存取描述符。数据描述符是一个拥有value-writable可写或不可写值的属性。存取描述符是由一对 get-set 函数功能来描述的属性。它们的默认值是undefined,而其它两个可选的属性enumerable,configurable的默认值是false
value
writable 当且仅当该属性的 writable 为 true 时,该属性才能被赋值运算符改变。默认为 false。
get
set 一个给属性提供 setter 的方法,如果没有 setter 则为 undefined。该方法将接受唯一参数,并将该参数的新值分配给该属性。默认为 undefined。
属性特性 configurable 表示对象的属性是否可以被删除,如果 configurable 特性为false,那么 writable 只能从true该为false外,其他特性都不能被修改,并且数据和存取描述符也不能相互切换。若尝试修改为不同的值,则抛出TypeError异常
属性特性 enumerable 定义了对象的属性是否可以在 for...in 循环和 Object.keys() 中被枚举。
这些选项不一定是自身属性,如果是继承来的也要考虑。为了确认保留这些默认值,你可能要在这之前冻结 Object.prototype,明确指定所有的选项,或者将__proto__属性指向null。
var o = {};
o.a = 1;
// 等同于 :
Object.defineProperty(o, "a", {
value : 1,
writable : true,
configurable : true,
enumerable : true
});
// 另一方面,
Object.defineProperty(o, "a", { value : 1 });
// 等同于 :
Object.defineProperty(o, "a", {
value : 1,
writable : false,
configurable : false,
enumerable : false
});
function Archiver() {
var temperature = null;
var archive = [];
Object.defineProperty(this, \'temperature\', {
get: function() {
return temperature;
},
set: function(value) {
temperature = value;
archive.push({ val: temperature });
},
enumerable:true,
configurable:true //可省略
});
this.getArchive = function() { return archive; };
}
var arc = new Archiver();
console.log(arc.archive);//undefined
arc.temperature = 11;
console.log(arc.temperature); //11
arc.getArchive(); // [{ val: 11 }]
原生JS:Object对象详细参考的更多相关文章
- js object 对象 属性和方法的使用
//object 对象 属性和方法的使用 var person = new Object(); person.name="张海"; person.age="; perso ...
- js object对象赋值bug和对象复制clone方法
最近在写程序的时候发现,如果新建一个object对象objb,初始化值为obja,如果改变了objb对象的字段值,那么obja也会随之改变,看来对象赋值传递的是一个引用. 代码重现: <scri ...
- 原生JS:Date对象详细参考
Date对象:基于1970年1月1日(世界标准时间)起的毫秒数 本文参考MDN做的详细整理,方便大家参考MDN 构造函数: new Date(); 依据系统设置的当前时间来创建一个Date对象. ne ...
- JS object(对象)的学习汇总
Object(对象)是在所有的编程语言中都十分重要的一个概念,对于事物我们可以把他们看作是一个对象,而每一个事物都有自己的表示的属性和对于某一信息作出的相应的操作.而这些东西就变成了事物的属性和方法. ...
- 原生JS的对象常用操作总结
前端时间写了篇怎么判断js对象相等的文章,一直在期待大神给点消息,无奈一直杳无音讯,还是自己写个函数来进行判断,下面总结一些常用的对象操作的方法. 咋们来个先抑后扬的方式,先放出几个基本的 ...
- 原生js实例对象方法
Array中的方法 ☞ toString() // 把数组转换为字符串,使用逗号分隔☞ valueOf() // 返回数组对象本身 ☞ 栈方法(先进后出)ary.push() // 该方法有一个返回值 ...
- Js学习(7)标准库-object对象
Js原生提供Object对象,O大写,所有的其他对象都继承自Object对象,都是Object的实例 Object对象的原生方法分为两类: 本身的方法:直接定义在Object对象的方法 实例方法:定义 ...
- js 函数对象的继承 inherit 带 插件完整解析版[helpers.js]
前言: 本人纯小白一个,有很多地方理解的没有各位大牛那么透彻,如有错误,请各位大牛指出斧正!小弟感激不尽. 本篇文章为您分析一下原生JS的对象继承方法 需求分析: 1. ...
- 基于原生js的图片延迟加载
当页面图片比较多的时候,我们通常会做一个延迟加载,避免页面打开时一下子的请求数太多,加载过慢影响用户体验. 如果项目用了jquery框架,则可以直接用 jquery.lazyload.可在jquery ...
随机推荐
- java简单词法分析器(源码下载)
java简单词法分析器 : http://files.cnblogs.com/files/hujunzheng/%E7%AE%80%E5%8D%95%E8%AF%8D%E6%B3%95%E5%88%8 ...
- 【原创】.NET读写Excel工具Spire.Xls使用(2)Excel文件的控制
本博客所有文章分类的总目录:http://www.cnblogs.com/asxinyu/p/4288836.html .NET读写Excel工具Spire.Xls使用文章 ...
- Java多线程系列--“JUC集合”04之 ConcurrentHashMap
概要 本章是JUC系列的ConcurrentHashMap篇.内容包括:ConcurrentHashMap介绍ConcurrentHashMap原理和数据结构ConcurrentHashMap函数列表 ...
- JavaWeb:Web与HTTP协议简介
JavaWeb:Web与HTTP协议简介 Web的概念 什么是Web: Web是网络上使用最广泛的分布式应用架构. 旨在共享分布在网络上的各个Web服务器中的所有互相连接的信息. 三个特征: 用HTM ...
- 聊Javascript中的AOP编程
Duck punch 我们先不谈AOP编程,先从duck punch编程谈起. 如果你去wikipedia中查找duck punch,你查阅到的应该是monkey patch这个词条.根据解释,Mon ...
- 分享关于Entity Framework 进行CRUD操作实验的结果
我们在使用Entity Framework框架进行CRUD时,经常会出现各种各样的错误,下面请看我的实验结果. 以下是只用一个上下文对象进行操作: 第一次: BlogDbContext blog = ...
- 阅读《LEARNING HARD C#学习笔记》知识点总结与摘要系列文章索引
从发表第一篇文章到最后一篇文章,时间间隔有整整一个月,虽只有5篇文章,但每一篇文章都是我吸收<LEARNING HARD C#学习笔记>这本书的内容要点及网上各位大牛们的经验,没有半点废话 ...
- HashSet 与TreeSet和LinkedHashSet的区别
Set接口 Set不允许包含相同的元素,如果试图把两个相同元素加入同一个集合中,add方法返回false. Set判断两个对象相同不是使用==运算符,而是根据equals方法.也就 ...
- 【转】nginx+iis实现负载均衡
最近在研究分布式系统架构方面的知识,包括负载均衡,数据库读写分离,分布式缓存redis等.本篇先从负载均衡服务架构入手,关于负载均衡百度百科的定义如下:负载均衡,英文名称为Load Balance,其 ...
- C#项目中常用到的设计模式
1. 引言 一个项目的通常都是从Demo开始,不断为项目添加新的功能以及重构,也许刚开始的时候代码显得非常凌乱,毫无设计可言.但是随着项目的迭代,往往需要将很多相同功能的代码抽取出来,这也是设计模式的 ...