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 协议》,转载必须注明作者和本文链接
推荐文章: