JavaScript对象类型之创建对象
引言
JavaScript中,可以通过对象直接量,关键字new(ECMAScript 5中的)Object.create(),函数来创建对象。
对象直接量
JavaScript中使用对象直接量来创建对象是最简单的方式。对象直接量是由若干名/值对组成的映射表,名/值对中间用冒号分隔,名/值对之间用逗号分隔,整个映射表用花括号括起来。
属性名可以是JavaScript标识符也可以是字符串直接量,属性值可以是任意类型的JavaScript表达式、表达式的值。
- 在ECMAScript 5(以及ECMAScript 3的一些实现)中,保留字可以用做不太带引号的属性名,但是对于ECMAScript 3来说,使用保留字作为属性名必须使用引号引起来。
- 在ECMAScript 5中,对象直接量中的最后一个属9性后的逗号将忽略,且在ECMAScript 3的大部分实现也可以忽略这个逗号,但是IE中则报错。
对象直接量是一个表达式,每次运算都需要创建并初始化一个新对象。每次计算对象直接量的时候,都会计算该对象每个属性的值。也就是说,如果在一个重复调用的函数中的循环体内使用了对象直接量,它将创建很多新对象,并每次创建的对象的属性也有可能有所不同。
通过new创建对象
new运算符创建并初始化一个新对象,例如:
var o = new Object(); // 创建一个空对象,和{}一样
var a = new Array(); // 创建一个空数组,和[]一样
var d = new Date(); // 创建一个表示当前时间的Date对象
var r = new RegExp("js"); // 创建一个可以进行模式匹配的RegExp对象
原型
每一个JavaScript对象(null除外)都和另一个对象相关联,“另一个”对象就是我们熟知的原型,每一个对象都从原型继承属性。
所有通过对象直接量创建的对象都具有同一个原型对象,并可以通过JavaScript代码Object.prototype获取对原型对象的引用。通过关键字new和构造函数调用创建的对象的原型就是构造函数的protopype属性的值。因此,同使用{}创建对象一样,通过new Object()创建的对象也继承自Object.prototype。同样,通过new Array()创建的对象的原型就是Array.prototype,通过new Date()创建的对象的原型就是Date.prototype。
补充
- 没有原型的对象不多,Object.prototype便是其中之一,它不继承任何属性。
- 所有的内置构造函数(以及大部分自定义的构造函数)都具有一个继承自Object.prototype的原型。
Object.create()
ECMAScript 5定义了一个名为Object.create()方法,用于创建一个新对象,其中第一个参数是这个对象的原型,第二个参数可选,用于对对象的属性进一步描述。
Object.create()是一个静态函数,而不是提供给某个对象调用的方法。使用它的方法很简单,只须传入所需的原型对象即可:
var o1 = Object.create({x:1,y:2}); // o1继承了属性x和y
可以通过传入参数null来创建一个没有原型的新对象,但是通过这种方式创建的对象不会继承任何东西,甚至不包括基础方法,比如toString(),也就是说,它将不能和“+”运算符一起正常工作:
var o2 = Object.create(null); // o2不继承任何属性和方法
如果想创建一个普通的空对象(比如通过{}或new Object()创建的对象)。需要传入Object.prototype:
var o3 = Object.create(Object.prototype); // o3和{}和new Object()一样
可以通过任何原型创建新对象(换句话说,可以使任意对象可继承),这是一个强大的特性,在ECMAScript 3中可以如下代码来模拟原型继承:
// inherit()返回了一个继承自原型对象p的属性的新对象
// 这里使用ECMAScript 5中的Object.create()函数(如果存在的话)
// 如果不存在Object.create(),则退化使用其他方法
function inherit(p) {
if (p == null) {
throw TypeError(); // p是一个对象
}
if (Object.create) { // 如果Object.create()存在
return Object.create(p); // 直接使用它
}
var t = typeof p; // 否则进行进一步检测
if(t !== 'object' && t !== 'function') {
throw TypeError();
}
function f() {}; // 定义一个空构造函数
f.prototype = p; // 将其原型属性设置为p
return new f(); // 使用f()创建p的继承对象
}
JavaScript对象类型之创建对象的更多相关文章
- JavaScript对象类型之简单介绍
引言 对象是JavaScript的基本数据类型. 对象是一种复合值:将很多值(原始值或者其他对象)聚合在一起,通过名字访问这些值. 对象可以看做属性的无序集合,每个属性都是一个名/值对.属性名是字符串 ...
- javascript——对象的概念——创建对象与销毁对象
一.创建对象 1.创建空对象 方式一: var o ={};o; //Object {} typeof(o); //"object" 方式二: var o=new Object() ...
- JavaScript对象类型判断注意点
注意点 不要使用 new Number() . new Boolean() . new String() 创建包装对象:用 parseInt() 或 parseFloat() 来转换任意类型到numb ...
- javascript笔记3-面向对象的程序设计-创建对象
javascript的对象:无序属性的集合,而每个属性可以包含基本值.对象或者函数.举例: var person = new Object(); person.name = "Nichola ...
- JavaScript总体的介绍【JavaScript介绍、定义函数方式、对象类型、变量类型】
什么是JavaScript? 我们可以从几个方面去说JavaScript是什么: 基于对象 javaScript中内置了许多对象供我们使用[String.Date.Array]等等 javaScrip ...
- javaScript对象-基本包装类型的详解
本人按书上的内容大致地把javaScript对象划分成“引用类型”.“基本包装类型”和“内置对象”三块内容. 我们这篇先了解下基本包装类型的详细用法吧! 一.我们先解下相关概念: 1.引用类型的值(对 ...
- JavaScript中判断对象类型方法大全1
我们知道,JavaScript中检测对象类型的运算符有:typeof.instanceof,还有对象的constructor属性: 1) typeof 运算符 typeof 是一元运算符,返回结果是一 ...
- JavaScript中判断对象类型的种种方法
我们知道,JavaScript中检测对象类型的运算符有:typeof.instanceof,还有对象的constructor属性: 1) typeof 运算符 typeof 是一元运算符,返回结果是一 ...
- JavaScript判断对象类型及节点类型、节点名称和节点值
一.JavaScript判断对象类型 1.可以使用typeof函数判断对象类型 function checkObject1(){ var str="str"; console.lo ...
随机推荐
- 并发编程(七)——AbstractQueuedSynchronizer 之 CountDownLatch、CyclicBarrier、Semaphore 源码分析
这篇,我们的关注点是 AQS 最后的部分,共享模式的使用.本文先用 CountDownLatch 将共享模式说清楚,然后顺着把其他 AQS 相关的类 CyclicBarrier.Semaphore 的 ...
- JS 中 原生方法 (二) --- 数组 (修---添加ES6新增)
const arr = [1, 2, 3, 5, 'a', 'b'] /** * * length * 这个只能被 称之为 数组的原生属性, 返回 一个 number * arr.length */ ...
- Java 技术笔记
vlist提取字段生成新list List<int> uidList = urResult.stream().map(p -> p.getUserId()).collect(Coll ...
- Unity实现c#热更新方案探究(三)
转载请标明出处:http://www.cnblogs.com/zblade/ 前面两篇文章从头到尾讲解了C#热更新的一些方案,从程序域来加载和卸载DLL,到使用ILRuntime来实现安卓和IOS平台 ...
- 行为驱动:Cucumber + Selenium + Java(二) - 第一个测试
在上一篇中,我们搭建好了Selenium + Cucumber + Java的自动化测试环境,这一篇我们就赶紧开始编写我们的第一个BDD测试用例. 2.1 创建features 我们在新建的java项 ...
- Asp.Net SignalR GlobalHost外部通知
GlobalHost 外部通知 之前都是在集线器类中进行服务器对客户端的通知操作,但是在开发中往往会有需求监控某个系统 ,比如OA系统 上级领导在上面宣布下午两点要开会 那么就要通知到其他的人.这里 ...
- SQL修改表字段,加附属属性
GO Go EXEC sys.[sp_addextendedproperty] @name = 'MS_Description',@value = '是否填写表单',@level0type = 'SC ...
- 巨杉数据库加入CNCF云原生应用计算基金会,共建开源技术生态
近日,巨杉数据库正式加入全球顶级开源社区,云原生应用计算基金会 (Cloud Native Computing Foundation,以下简称CNCF),成为CNCF基金会会员,是中国最早加入的开源云 ...
- python数据包之利器scapy用法!
scapy介绍: 在python中可以通过scapy这个库轻松实现构造数据包.发送数据包.分析数据包,为网络编程之利器! scapy安装: pip install scapy ======> ...
- k8s运行容器之Job(四)--技术流ken
Job 容器按照持续运行的时间可分为两类:服务类容器和工作类容器. 服务类容器通常持续提供服务,需要一直运行,比如 http server,daemon 等.工作类容器则是一次性任务,比如批处理程序, ...