创建对象

在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.round);//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]
原文地址:https://www.cnblogs.com/aaron-shu/p/4187041.html