Javascript模式阅读笔记 · 简介

JavaScript是一门基于Web的语言。它最初是作为在网页中操作一些特定类型元素(例如图像和表格字段)的方法,现在该语言的发展已经远远超出了预期。除了作为客户端浏览器所使用的脚本,现在JavaScript还可以用于正在增加的更加多样化的平台编程。例如可以用于编写服务端代码(.net或node.js)、应用程序的扩展(Firefox和Photoshop编写扩展)、移动应用程序和命令行脚本。

JavaScript也是一门与众不同的语言。它没有类,并且函数是用于很多任务的顶层类对象。最初很多程序员认为该语言效率低下,但近年来该观念有所改变。有趣的是,例如Java和PHP这类语言开始增加闭包和匿名函数特性,而JavaScript程序员早就已经享用了这些特性。

JavaScript是一门动态性较强的语言,通过配置可以使其看上去和感觉起来像您过去习惯的其他语言一样。但接受JavaScript与其他语言的不同,并学习其特定的模式可能是更好的方法。

 

什么是模式(Pattern)

维基百科解释为: 在物体或事件上,产生的一种规律变化与自我重复的样式与过程。在模式之中,某些固定的元素不断以可预测的方式周期性重现。最基本而常见的模式,称为密铺,具备重复性以及周期性两大特征。找寻出固定模式是人类基本的认知功能之一。

在软件开发中,模式是指一个通用问题的解决方案。一个模式不仅仅是一个可以用来复制粘贴的代码解决方案,更多地提供了一个更好的实践经验、有用的抽象化表示和解决一类问题的模板。

 

学习模式的理由

1. 通过学习模式,可以帮助我们使用经过实践证明有效的经验来编写代码,而无需做很多无用工作。

2. 模式提供了某种程度上的抽象。我们的大脑在一定时间内仅仅能记住一定数量的内容,因此在思考更复杂的问题时,使用模式可以让您集中经理去用已有模式来解决该问题,而不需要被一些低层次的细节所困扰。

3. 模式可以改善开发者和开发团队之间的交流。

 

JavaScript基本概念 · 面向对象

JavaScript是一门面向对象的语言,任何一段Javascript代码都很有可能是一个对象。只有五中基本类型不是对象:数值类型(Number)、字符串类型(String)、布尔类型(Boolean)、空类型(null)和未定义类型(undefined)。其中前三个类型有对应的以基本类型封装形式体现的对象表示。数值类型、字符串类型和布尔类型的值可以通过程序员或者位于幕后的JavaScript解释器来实现向对象的转换。

函数(Function)实际上也是对象,函数有属性和方法。

在任何一门程序语言中最简单的事情就是定义一个变量。在JavaScript中,一旦定义好一个变量,同时也就已经正在处理对象了。首先,该变量会自动成为内置对象的一个属性,成为激活对象(如果该变量是一个全局变量,那该变量会成为全局对象的一个属性)。

var a = 1;
console.log(window.a);      // return => 1
console.log(window["a"]);   // return => 1

该变量实际上也是伪类,因为它拥有其自身的属性(attributes),该属性决定了该变量是否可以被修改、被删除和在一个for in循环中进行枚举。这些属性在EMCAScript 3中没有直接对外提供,但在第5版本中,提供了一个特殊描述符方法来操作这些属性。

那么对象是什么东西呢?因为他们需要做很多事情,所以这些对象必须十分特殊。实际上对象十分简单的。一个对象仅仅是一个容器,该容器包含了命名的属性、键-值对(大多数)的列表。这里面的属性可以是函数(函数对象),这种情形下我们称其为方法(Function)。

关于创建的对象的另外一件事情是可以在任意时间修改此对象(ECMAScript 5引入了API来防止突变)。可以对一个对象执行添加、删除和更新它的成员变量。如果关注隐私和访问,在模式方面也有对应的内容。

对象主要有两种类型:

原生的(Native)、主机的(Host)

原生对象可以进一步分为内置对象(例如数组、日期对象等)和用户自定义对象(例如 var P={x: 0, y: 5};)等。

主机对象包含windows对象和所有的DOM对象。如果还不确定使用的是否是主机对象,可以尝试在不同的、无浏览器的环境下运行该代码,如果该代码能正确的运行,那么应该使用的是原声的对象。

 

JavaScript基本概念 · 没有类

在JavaScript中没有类。不使用类的做法可以使得编程更为简洁。在创建一个对象的时候,无需先拥有一个类。这对于其他编程语言是不同的。

对于其他编程语言,创建对象的方式(C#):

public class P{
    private int x;
    private int y;
    
    public P(int x, int y){
        this.x = x;
        this.y = y;  
    }
}

P pointA = new P(1, 2);

 

而JavaScript:

var pointA = { x: 1, y: 2};

 

这样在需要创建一个简单对象的时候,往往JavaScript更为简单,我们亦希望让对象更为简洁。

在JavaScript中,可以在需要的时候创建一个空对象,然后开始为该对象添加感兴趣的成员变量。可以为该对象添加基本类型、函数和其他对象来作为该对象的属性。一个“空对象”实际上并不是完全空白的,他实际上包含了一些内置的属性,但没有其自身的属性。

“尽量多使用对象的组合,而不是使用类的继承”。这句话的意思是通过已有的对象组合来获取新对象,是比通过很长时间的父-子继承链来创建新的对象更好的一种方法。在JavaScript中可以很简单地实践该建议,之所以这么简单是因为在JavaScript中没有类,因此使用对象组合是唯一可以采取的方法。

 

JavaScript基本概念 · 原型(Prototypes)

JavaScript没有继承,尽管这是重用代码的一种方式。但JavaScript可以使用多种方法实现继承,这里通常使用原型。原型是一个对象,并且创建的每一个对象都会自动获取一个Prototypes属性,该属性指向一个新的空对象。该对象几乎等同于采用对象字面量或Object()创建的对象,区别在于它的构造器(constructor,该属性返回对创建此对象的数组函数的引用)属性指向了所创建的函数,而不是指向内置的Object()函数。可以为该空对象增加成员变量,以后其他对象也可以从该对象继承并像使用自己的属性一样使用该对象的属性。

 

var P = function (x, y) { this.x = x; this.y = y; }
console.log(P.prototype);  // Object {}
console.log(P.constructor);  // function Function() { [native code] }
var p = new P(1, 2);
console.log(p.constructor);  // function (x, y) { this.x = x; this.y = y; }
console.log(p.constructor.prototype === P.prototype);  // true

 

原型就是一个对象(不是一个类,也不是其他特殊的元素),每一个函数都有Prototype属性。

 

JavaScript基本概念 · 环境

JavaScript需要运行环境来执行。通常JavaScript是在浏览器中执行的,但是这不是唯一的运行环境。本书中介绍的模式大部分是和核心JavaScript(ECMAScript)相关的。因此它们是与环境无关的。除了以下两种情况以外:

1. 特定针对浏览器的模式。

2. 其他示范模式的实际应用程序范例。

环境会提供自身的主机对象(例如window对象),该对象在ECMAScript标准中没有定义,可能会带来没有特别提到的和不确定的行为。

 

JavaScript基本概念 · EMCAScript 5

核心的JavaScript编程语言(不包含DOM、BOM和额外的主机对象)是基于EMCAScript标准(缩写为ES)。该标准的第三版是在1999年被官方所接受,并且是当前浏览器所使用的标准。该标准的第四版被放弃了,第五版在2009年12月得到通过,这相比第3版过去了10年。

目前支持ECMAScript 5浏览器

浏览器 IE Firefox Chrome Safari Opera

IOS

Safari

Opera

Mini

Android

Browser

Blackberry

Browser

IE Mobile
版本 10 - 11 22 - 25 28 - 31 6 - 7 16 - 17 5 - 7 不支持 3.0 - 4.2 7 - 10 10

此表统计于2013年9月

第5版ECMAScript增加了一些新的内置对象、方法和属性,但最重要的是增加了所谓的strict(严格)模式,该模式实际上可以从JavaScript语言中移除某些特性,使得程序更为简洁和不容易出错。例如with语句的语法在这几年中有很多争议。现在在ES5的strict模式中将会引发错误,尽管在非strict模式中能正常运行。strict模式是通过一个普通字符串来触发的,在该语言的较早的实现方式中将会忽略掉该代码。这意味着通过使用strict模式,可以实现向后兼容性,因为在之前不能理解该代码的浏览器中,它不会引起错误。

在一个作用域(可以是函数作用域、全局作用域或者在将字符串的起始位置传递给eval()中),也可以使用如下字符串:

function My(){
    "use strict";
    //...以下放置函数的其余部分
}

 

这就意味着函数中的代码是在ECMAScript语言的strict子集中运行。对于之前的浏览器,这仅仅是一个字符串,并没有分配给任何变量,因此不会被使用,进而不会导致错误。

在本语言的未来计划中,将只允许使用strict模式。考虑到ES5是一个过渡版本,本语言现在鼓励开发者使用strict模式编写代码,但不强制要求。

posted on 2013-09-29 13:42  雨梦萱橪  阅读(182)  评论(0编辑  收藏  举报