JavaScript学习笔记(三) 字面量和构造方法
2012-09-16 21:45
363 查看
接下来的几天,会写一些关于字面量和构造方法的内容。以前写的那么长,同学都说看不下去,我写着累,看着累,改起来累。
所以以后都会写的简短一些。
言归正传,字面量语法模式在JavaScript中更简单,也更具有表现力而且减少了容易出错的对象的定义;
接下来,我们会讨论字面量,如对象字面量,数组字面量,正则表达式字面量和为什么它们比使用等价的内置构造方法更好,如Object(),Array();
引入JSON格式去描述数组和对象字面量是如何去用作数据传输格式;也会讨论传统的构造方法如何强制使用new操作符去构造;
为了扩展,我们会讨论内置的包装器构造方法Number(),String(),Boolean()和它们如何和基本类型number,string和boolean值比较;
最后,我们还会看一个不同的内置的Error()构造函数。
值可以是基本类型或者其他对象,不管哪种情况,它们都可以被叫做属性(properties.),值可以是函数(function),在这种情况下,我们可以称之为方法(method);
在JavaScript中,你自定义的对象(你自己定义的内置对象)在任何时候都是可变的,许多内置对象的属性都是可变的;
你可以用一对大括号{}创建一个空对象,然后添加你想要的属性和方法;
对象字面量是理想的方式对于这种灵活的对象创建。
在这个例子中,我们白手起家先建了一个空对象,然后给它添加了一个属性和一个方法。
在程序运行的任何时间,我们可以:
1.改变属性或方法的值
你不必从一个空对象开始,对象字面量模式可以让你在对象创建的时候就给对象添加属性或方法,就像这样:
声明:目前为止,我们经常看到空对象(“blank object” and “empty object”);这都是为了简单起见,在JavaScript中没空对象;
即使是最简单的{}对象,也有一些从Object.prototype继承而来属性和方法,使用“空”是为了让我知道这个对象除了继承的属性没有任何自己的属性。
大体上,这种方式的语法如下:
1.将你的对象包裹在一对{}中;
2.在对象中使用逗号分隔属性或方法,在最后一个键值对的尾部的逗号是允许的,但在IE中会产生错误,所以不要用它;
3.使用一个分号分隔属性名和属性值;
4.当你将一个对象赋值给一个变量的时候,不要忘了}号后的分号;
但JavaScript也提供了构造方法,用法和其他面向对象的语言(Java)类似。
你可以用你自己的构造方法或者用内置的构造方法(Obejct(),Date(),String())创建对象;
下面是一个例子,两种等价方式创建两个相同的对象:
另一个优先使用对象字面量的原因就是,它强调对象是简单易变而不是需要从一个模子(class)中创建;
还有一个使用字面量的原因,相对于Object()构造方法,对象字面量没有作用域解析;
因为你不太可能会使用了相同的名字创建了一个局部的构造方法,
JavaScript解释器需要从你调用Object()的地方查找作用域链,一直向上直到找到全局的Object()构造方法。
因此,你需要了解Object()构造函数一个特性,这个特性就是Object()构造函数会接受一个参数,并且根据这个参数,
它可能决定代理创建其它内置构造函数对应的对象并且返回和你预期的对象不同的对象;
最后,再一次,不要使用new Object(),使用简单可靠的对象字面量替代。
所以以后都会写的简短一些。
言归正传,字面量语法模式在JavaScript中更简单,也更具有表现力而且减少了容易出错的对象的定义;
接下来,我们会讨论字面量,如对象字面量,数组字面量,正则表达式字面量和为什么它们比使用等价的内置构造方法更好,如Object(),Array();
引入JSON格式去描述数组和对象字面量是如何去用作数据传输格式;也会讨论传统的构造方法如何强制使用new操作符去构造;
为了扩展,我们会讨论内置的包装器构造方法Number(),String(),Boolean()和它们如何和基本类型number,string和boolean值比较;
最后,我们还会看一个不同的内置的Error()构造函数。
对象字面量(Object Literal)
当你在想象JavaScript中的对象时,可以简单的想象成键值对的(key-value)哈希表(hash tables);值可以是基本类型或者其他对象,不管哪种情况,它们都可以被叫做属性(properties.),值可以是函数(function),在这种情况下,我们可以称之为方法(method);
在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(),使用简单可靠的对象字面量替代。
相关文章推荐
- JavaScript学习笔记(三十二) 经典继承模式二-借用构造方法
- JavaScript across domain 方法 学习笔记
- 黑马视频学习笔记-OC-id、构造方法
- swift学习笔记之构造方法和析构方法
- javascript学习笔记—DOM常用API、属性、方法、函数
- JS学习笔记——JavaScript继承的6种方法(原型链、借用构造函数、组合、原型式、寄生式、寄生组合式)
- javascript 学习笔记 【数组迭代方法】
- 【c#学习笔记】在一个构造方法中调用另一个构造方法的写法
- Javascript学习笔记_Reduce()方法详解
- 【前端学习笔记】原生Javascript中通过JSONP(前端常用方法)进行跨域
- 【JavaSE学习笔记】面向对象_01(入门,匿名对象,成员变量,局部变量,封装,this,构造方法)
- javascript 的escape方法 (学习笔记)
- JavaScript高级程序设计学习笔记3: Math对象比较常用的几个方法
- IOS学习笔记05_1-Swift-如何定义类和类的构造方法、重载方法
- 学习笔记之C#类的构造方法
- Java程序猿的JavaScript学习笔记(9—— jQuery工具方法)
- php学习笔记------[面向对象的构造与析构方法]
- Java学习笔记之构造方法和static使用
- Objective-C基础学习笔记(六)-property与构造方法
- Java学习笔记——构造方法