JS 创建对象

对象直接量

对象直接量是由若干个键值对组成的映射表,键值对中间用冒号分隔,键值对之间用逗号分隔,整个映射表用花括号括起来。

var point = { x:0, y:0 };
var book = {
    "main title": "javascript",
    'sub-title': "the definitive guide",
    author: {
        firstname: "su",
        surname: "yang"
    }
}

通过new创建对象

new运算符创建并初始化一个新对象。关键字new后跟一个函数调用。这里的函数称作构造函数(constructor),构造函数用以初始化一个新创建的对象。JS语言核心中的原始类型都包含内置构造函数。

var o = new Object();        //创建一个空对象,和{}一样
var a = new Array();     //创建一个空数组,和[]一样
var d = new Date();       //创建一个表示当前时间的Date对象
var r = new RegExp("js");       //创建一个可以进行模式匹配的RegExp对象

原型

在将第三种对象创建技术之前,首先了解一下原型。每一个JS对象(null除外)都和另一个对象相关联。另一个对象就是我们熟知的原型,每一个对象都从原型继承属性。

  • 所有通过对象直接量创建的对象都具有同一个原型对象,可以通过Object.prototype获得对原型对象的引用
  • 通过关键字new和构造函数调用创建的对象的原型就是构造函数的prototype属性的值。同使用{}创建对象一样,通过new Object()创建的对象也继承自Obeject.prototype,通过new Array()创建的对象的原型就是Array.prototype,通过new Date()创建的对象的原型就是Date.prototype
  • 所有的内置构造函数都距有一个继承自Object.prototype的原型。比如,Date.prototype的属性继承自Object.prototype,因此由new Date()创建的Date对象的属性同时继承自Date.prototype和Object。prototype。这一系列链接的原型对象就是所谓的:“原型链”。

Object.create()

ES5定义了一个名为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()一样

可以通过任意原型创建新对象,也就是说,可以使任意对象可继承。

通过原型继承创建一个新对象

// inherit() 返回一个继承自原型对象p的属性的新对象
// 这里使用ES5中的Object.create()函数(如果存在的话)
// 如果不存在Object.create(),则退化使用其他方法
function inherit(p) {
    if (p == null) throw TypeError();          //p是一个对象,但不能是null
    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的继承对象
}
本作品采用《CC 协议》,转载必须注明作者和本文链接
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!