标签:
在javascript中,有以下三种创建对象的方式:对象直接量、关键字new和ECMAScript 5中的Object.create()函数。
一、对象直接量
对象直接量是由若干键/值对组成的映射表,整个映射表用花括号括起来。属性名可以是javascript标识符也可以是字符串直接量(包括空字符串)。属性的值可以是任意类型的javascript表达式,表达式的值(可以是原始值也可以是对象值)就是这个属性的值。
ECMAScript5和ECMAScript3中的一些区别:在ECMAScript5(以及ECMAScript 3的一些实现)中,保留字可以用做不带引号的属性名,而在ECMAScript 3中,使用保留字作为属性名必须使用引号引起来;在ECMAScript 5中(以及ECMASCript 3的大部分实现中),对象直接量中的最后一个属性后的逗号将忽略,但在IE8-中则报错。
对象直接量是一个表达式,它的每次运算都会创建并初始化一个新的对象,也都会计算它的每个属性的值。如果在一个重复调用的函数中的循环内使用了对象直接量,它将创建很多新对象,并且每次创建的对象的属性值也有可能不同。
下面是一些例子:
var empty={};//没有任何属性的对象 var book={ "main title":"javascript",//属性名字里有空格,必须用字符串表示 "sub-title":"the definitive guide",//属性名字里有连字符,必须用字符串表示 "for":"all audiences",//‘for‘保留字,因此必须用引号 author:{//属性的值是一个对象 firstname:"David", surname:"Flanagan" } };
二、关键字new
new运算符创建并初始化一个新对象,关键字new后跟随一个函数调用,这里的函数称做构造函数(constructor),构造函数用来初始化一个新创建的对象。javascript语言核心中的原始类型都包含内置构造函数。
var o=new Object();//创建一个空对象,和{}一样 var a=new Array();//创建一个空数组,和[]一样 var d=new Date();//创建一个表示当前时间的Date对象 var r=new RegExp("js");//创建一个可以进行模式匹配的RegExp对象
当然,也可以用自定义构造函数来初始化新对象。
三、Object.create
ECMAScript 5定义了一个名为Object.create()方法,它创建一个具有指定的内部原型且包含指定的属性(如果有)的新对象,其中第一个参数是这个对象的原型;第二个为可选参数。Object.create()在IE9-中不受支持。
Object.create()是一个静态函数,而不是提供给某个对象调用的方法。使用它的方法,只须传入所需的原型对象即可。可以通过任意原型创建新对象,也就是说可以使任意对象可继承。
var o1=Object.create({x:1,y:2});//o1继承了属性x和y var o2=Object.create(null);//o2不继承任何属性和方法 var o3=Object.create(Object.prototype);//o3和{}和new Object()一样
下面的示例创建使用 null 原型的对象并添加两个可枚举的属性。
var newObj = Object.create(null, { size: { value: "large", enumerable: true }, shape: { value: "round", enumerable: true } }); console.log(newObj.size);//large console.log(newObj.size);//round console.log(Object.getPrototypeOf(newObj));//null
下面的示例创建了一个具有与 Object 对象相同的内部原型的对象。 Object.getPrototypeOf 函数可获取原始对象的原型。 若要获取对象的属性描述符,可以使用Object.getOwnPropertyDescriptor函数。
var firstLine = { x: undefined, y: undefined }; var secondLine = Object.create(Object.prototype, { x: { value: undefined, writable: true, configurable: true, enumerable: true }, y: { value: undefined, writable: true, configurable: true, enumerable: true } }); document.write("first line prototype = " + Object.getPrototypeOf(firstLine)); document.write("<br/>"); document.write("second line prototype = " + Object.getPrototypeOf(secondLine)); // Output: // first line prototype = [object Object] // second line prototype = [object Object]
标签:
原文地址:http://www.cnblogs.com/aaron-shu/p/4187041.html