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的方法:

View Code
 利用Constructor创建Object

js中虽然没有类,但是依然保留了构造函数这个用法,我们可以用new来创造一个新的object。当然,还有一些内置的constructor,如Date, Object, RegExp...

当然我们也可以自己创建自己的构造函数:

View Code
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会被隐式的返回(当然是你在没显示式的返回什么的时候)

还是上面的代码,请注意注释:

View Code
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

View Code
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()..

当然 我们也可以自己往外抛一些自定义错误:

View Code
throw {
  name: 'Error',
  message: 'uh-oh'
}

 

 

 

 

//这就是定义object literal的方法{}
var dog={};

//添加一个属性
dog.name="benji";

//添加一个方法
dog.getName=function(){
  return dog.name;  
}
posted @ 2012-09-13 17:47  moonreplace  阅读(229)  评论(0编辑  收藏  举报