接下来的几天,会写一些关于字面量和构造方法的内容。以前写的那么长,同学都说看不下去,我写着累,看着累,改起来累。
所以以后都会写的简短一些。
言归正传,字面量语法模式在JavaScript中更简单,也更具有表现力而且减少了容易出错的对象的定义;
接下来,我们会讨论字面量,如对象字面量,数组字面量,正则表达式字面量和为什么它们比使用等价的内置构造方法更好,如Object(),Array();
引入JSON格式去描述数组和对象字面量是如何去用作数据传输格式;也会讨论传统的构造方法如何强制使用new操作符去构造;
为了扩展,我们会讨论内置的包装器构造方法Number(),String(),Boolean()和它们如何和基本类型number,string和boolean值比较;
最后,我们还会看一个不同的内置的Error()构造函数。
对象字面量(Object Literal)
当你在想象JavaScript中的对象时,可以简单的想象成键值对的(key-value)哈希表(hash tables);
值可以是基本类型或者其他对象,不管哪种情况,它们都可以被叫做属性(properties.),值可以是函数(function),在这种情况下,我们可以称之为方法(method);
在JavaScript中,你自定义的对象(你自己定义的内置对象)在任何时候都是可变的,许多内置对象的属性都是可变的;
你可以用一对大括号{}创建一个空对象,然后添加你想要的属性和方法;
对象字面量是理想的方式对于这种灵活的对象创建。
你不必从一个空对象开始,对象字面量模式可以让你在对象创建的时候就给对象添加属性或方法,就像这样:
声明:目前为止,我们经常看到空对象(“blank object” and “empty object”);这都是为了简单起见,在JavaScript中没空对象;
// start with an empty object
var dog = {};
// add one property
dog.name = "Benji";
// now add a method
dog.getName = function() {
return dog.name;
};
在这个例子中,我们白手起家先建了一个空对象,然后给它添加了一个属性和一个方法。
在程序运行的任何时间,我们可以:
1.改变属性或方法的值
dog.getName = function() {
// redefine the method to return
// a hardcoded value
return "Fido";
};
2.完全移除属性或方法
delete dog.name;
3.添加更多的属性和方法
dog.say = function () {
return "Woof!";
};
dog.fleas = true;
var dog = {
name: "Benji",
getName: function() {
return this.name;
}
};
声明:目前为止,我们经常看到空对象(“blank object” and “empty object”);这都是为了简单起见,在JavaScript中没空对象;
即使是最简单的{}对象,也有一些从Object.prototype继承而来属性和方法,使用“空”是为了让我知道这个对象除了继承的属性没有任何自己的属性。
对象字面量语法(The Object Literal Syntax)
如果你过去没使用过对象字面量,你开始可能看起来有点古怪;当你用的多了,你就会越发爱上它;
大体上,这种方式的语法如下:
1.将你的对象包裹在一对{}中;
2.在对象中使用逗号分隔属性或方法,在最后一个键值对的尾部的逗号是允许的,但在IE中会产生错误,所以不要用它;
3.使用一个分号分隔属性名和属性值;
4.当你将一个对象赋值给一个变量的时候,不要忘了}号后的分号;
从构造方法获取对象(Objects from a Constructor)
在JavaScript中没有类,但这造也就了JavaScript巨大的灵活性,因为你事先不需要知道关于对象任何信息,你不需要一个类的蓝图;
但JavaScript也提供了构造方法,用法和其他面向对象的语言(Java)类似。
你可以用你自己的构造方法或者用内置的构造方法(Obejct(),Date(),String())创建对象;
下面是一个例子,两种等价方式创建两个相同的对象:
// one way -- using a literal
var car = {goes: "far"};
// another way -- using a built-in constructor
// warning: this is an antipattern
var car = new Object();
car.goes = "far";
正如你从这个例子看到的,对象字面量一个明显的好处就是它更加简洁;
另一个优先使用对象字面量的原因就是,它强调对象是简单易变而不是需要从一个模子(class)中创建;
还有一个使用字面量的原因,相对于Object()构造方法,对象字面量没有作用域解析;
因为你不太可能会使用了相同的名字创建了一个局部的构造方法,
JavaScript解释器需要从你调用Object()的地方查找作用域链,一直向上直到找到全局的Object()构造方法。
了解Object 构造方法(Object Constructor Catch)
你没有任何理由使用new Object(),当你可以使用对象字面量的时候,但你可能经手别人写的遗留代码。
因此,你需要了解Object()构造函数一个特性,这个特性就是Object()构造函数会接受一个参数,并且根据这个参数,
它可能决定代理创建其它内置构造函数对应的对象并且返回和你预期的对象不同的对象;
// Warning: antipatterns ahead
// an empty object
var o = new Object();
console.log(o.constructor === Object); // true
// a number object
var o = new Object(1);
console.log(o.constructor === Number); // true
console.log(o.toFixed(2)); // "1.00"
// a string object
var o = new Object("I am a string");
console.log(o.constructor === String); // true
// normal objects don't have a substring()
// method but string objects do
console.log(typeof o.substring); // "function"
// a boolean object
var o = new Object(true);
console.log(o.constructor === Boolean); // true
当传入的值是动态的直到运行的时候才能知道的时候,Object()构造方法的这种行为会导致意想不到的结果;
最后,再一次,不要使用new Object(),使用简单可靠的对象字面量替代。