Javascript Patterns--读书笔记3 ( Literal and Constructors )
literal其实类似于我们可以对array, function, object...这些由基本类型(string, number,boolean,null, undefined)所组成的复合类型,像简单类型那样来赋值,而不需要动用new来操作。
Object Literal:
实际上javascript中的object类似于hash table中的键值对,它的值可以是基本类型,当然也可以是别的object,我们称之为属性。如果值是function,我们就称他们为method.
来看下面的定义object的方法:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
js中虽然没有类,但是依然保留了构造函数这个用法,我们可以用new来创造一个新的object。当然,还有一些内置的constructor,如Date, Object, RegExp...
当然我们也可以自己创建自己的构造函数:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
var Person = function (name) { this.name = name; this.say = function () { return "I am "+ this.name; } } var adam = new Person ("Adam"); adam.say(); // I am Adam
当我们用new和构造函数来创建一个对象时,将会发生下面的一系列行为:
- 一个空的对象会被创建,我们可以用this来引用它,同时它会继承function的prototype
- 属性和方法会被加入到这个新创建的空对象,通过this.
- 这个新创建的对象将会被返回,也就是this会被隐式的返回(当然是你在没显示式的返回什么的时候)
还是上面的代码,请注意注释:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
var Person = function (name) { //创建一个新的空对象 //var this = {}; 用直接量的形式 //添加属性和方法 this.name = name; this.say = function () { return "I am "+ this.name; }; //return this; }
强制用new模式
上面已经讲到过,用new会发生什么,还是上面的代码,那么如果我们忘记了用new, this就不知会指向谁了,这要根据context来定
来看一下,如何实现这种模式:
using that
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
function Waffle() { var that = {}; that.tastes = "yummy"; return that; } //为了简化,也可以利用下面的代码 function Waffle() { return { tastes : 'yummy' } } //测试代码: var first = new Waffle(), second = Waffle(); console.log(first.tastes); console.log(second.tastes);
self-Invoking Constructor
function Waffle() { if (!(this instanceof Waffle)) { return new Waffle(); } this.tastes = 'yummy'; }
JSON
{"name":"value", "some" :[1,2,3]},类似于这样的,在这里面,你不可以用functions和正则表达式
在ES5中,JSON.parse()已经是现代浏览器所必须支持的一部分了,如果不支持我们可以得用http://www.json.org/json2.js提供的库,而不要用eval()函数来解析JSON
Regular Expression Literal
两种方式可以产生:
new RegExp(), /正则表达式内容/
正则表达式中的参数g (在全文搜索), m(匹配多行) , i(大小写敏感)
Primitive Wrappers
number, string, boolean, null, undefined这些就是js中的原始数据类型,除了null, undefined, 其他的都有wrapper objects.那么如何来创建呢, 利用构造函数 Number(), String(), Boolean()
我们为什么要用这些wrapper functions呢, 因为我们可以借助于其相当丰富的函数支持,如number函数就有toFixed(), to Expoential(). String有substring(), charAt(), toLowerCase()...。
来看下面的代码:
var s="hello"; console.log(s.toUpperCase()); //"HELLO" "monkey".slice(3, 6);//'key'
我们发现,我们的这些primitive的直接量,可以直接来用那些wrapper object的方法。
Error Objects
js中有一些内置的错误构造函数Error(), SyntaxError(), TypeError()..
当然 我们也可以自己往外抛一些自定义错误:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
throw { name: 'Error', message: 'uh-oh' }
//这就是定义object literal的方法{} var dog={}; //添加一个属性 dog.name="benji"; //添加一个方法 dog.getName=function(){ return dog.name; }