zoukankan      html  css  js  c++  java
  • JavaScript对象类型之创建对象

    引言

    JavaScript中,可以通过对象直接量,关键字new(ECMAScript 5中的)Object.create(),函数来创建对象。

    对象直接量

    JavaScript中使用对象直接量来创建对象是最简单的方式。对象直接量是由若干名/值对组成的映射表,名/值对中间用冒号分隔,名/值对之间用逗号分隔,整个映射表用花括号括起来。

    属性名可以是JavaScript标识符也可以是字符串直接量,属性值可以是任意类型的JavaScript表达式、表达式的值。

    1. 在ECMAScript 5(以及ECMAScript 3的一些实现)中,保留字可以用做不太带引号的属性名,但是对于ECMAScript 3来说,使用保留字作为属性名必须使用引号引起来。
    2. 在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。

    补充

    1. 没有原型的对象不多,Object.prototype便是其中之一,它不继承任何属性。
    2. 所有的内置构造函数(以及大部分自定义的构造函数)都具有一个继承自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的继承对象
    }
    
  • 相关阅读:
    CAS 5.X 安装
    《从0到1》开启商业和未来的秘密
    阿里Java开发规约插件使用
    【Effective Java】阅读
    Java8 流的使用示例
    我对线程安全的理解
    APP微信支付实现
    如何将微信上传AMR格式语音转化为MP3格式
    如何在下载文件前确定文件名
    寻找水王1
  • 原文地址:https://www.cnblogs.com/xiao2/p/7801839.html
Copyright © 2011-2022 走看看