前言

如何使用本书

我们视读者为学习者

怎样才能学会东西呢?首先你得明白,其次你得牢记,但这并不意味着死记硬背。认知科
学、神经生物学和教育心理学的最新研究表明,学习过程远比阅读文字要丰富得多。我们
知道如何激活大脑。

本书遵循的一些学习原则

使用视觉化元素。 图片比文字更容易记忆,并可极大地提高
学习效率(可将记忆和理解程度提高89%)。图片还让知识
理解起来更容易。通过 将文字放在相关图片的内部或附近
而不是放在图片的下面或另一页,可将学习者解决相关问题
的能力提高两倍。

使用个性化的对话。 最新的研究表明,相比于一本正
经的语气,教师采用第一人称以对话的方式讲解时,学生的考试成绩可提高
40%。我们使用口语化的语言讲故事,而不是一本正经地说教。激动人心
的晚宴对话和枯燥讲座,哪个更能激发你的兴趣呢?

激发学习者更深入地思考。 换而言之,如果你不去积极地刺激
神经元,大脑就不会有太大的反应。要让学习者能够解决问
题、得出结论、举一反三,就必须让他心生好奇、对学习有
积极性并沉醉其中。为此,需要让学习者应对挑战、做练习、
回答引人深思的问题,并完成一些需要左右脑和多个感官
参与的活动。

引起并保持读者的兴趣。 大家都有这样的经验:心里想学,
可一页还没看完就瞌睡连连。大脑只会对不同寻常、有趣、怪异、抓人眼球、出乎意料的东西感兴趣。面对新的高深技术
过程不再枯燥乏味,就会事半功倍。
触动心弦。 你知道,能不能记住一样东西,在很大程度上取决于它对你情绪的影
响。你会记住自己关心的东西,也会记住触动你心弦的东西。这里说的可不是小
男孩和小狗之间虐心的故事,而是在玩填字游戏、学习人人都认为很难的东西或。
意识到自己很厉害时油然而生的惊讶、好奇、开心、疑惑和傲视天下等情绪

元认知:对思维方式的思考
如何让大脑认为JavaScript与老虎一样重要?

有缓慢乏味的方式,也有快速高效的方式。缓慢的方式就是没完
没了地重复。

快速的方式是竭尽所能地刺激大脑活动,尤其是不同类型的大脑活动。

如何让大脑听话
1 别着急。理解的越多,需要记忆的就越少。
不要只是埋头苦读,时不时地停下来想一想。
看到问题时,不要马上去翻答案,要想象有
人问你这个问题。大脑想得越深,学会并记
住相关内容的可能性越大。

2 做练习,记笔记。
不能指望我们来替你做这些练习,不然,与
让人替你锻炼何异。拿起笔来,亲自动手。
大量的证据表明,在学习期间做些体力活动,
可提高学习效率。

3 阅读“世上没有愚蠢的问题”。
一个都不要落下。这些都是核心内容,绝非可
有可无的,千万不要跳过。

4 让阅读本书成为你睡前的最后一件事,至少不要做
其他有挑战性的事情。

你放下书本后,学习过程(尤其是变成长期记
忆的过程)还在继续。大脑需要消化的时间,
如果在此期间你在做其他事情,就会忘记有些
刚学到的知识。

5 多喝水。
身体水分充足时,大脑最清晰。如果身体缺少
水分(可能你还未感到口渴时就会出现这种情
况),人的认知能力就会下降。

6 大声读出来。
朗读会激活大脑的另一个部分。要理解什么东西
或加深对其的记忆时,可将其大声朗读出来。更
佳的做法是,尝试向人进行解释。这样你将学得
更快,还可能发现阅读时没有发现的新东西。

7 倾听大脑的心声。
注意大脑是否不堪重负。如果你发现自己开始变
得敷衍了事或看后就忘,就说明该休息了。疲劳
到一定程度后,如果还不休息,就会欲速而不达,
甚至影响学习兴趣。

8 心有感悟。
这样大脑才知道你阅读的内容很重要。置身到故
事中,给图片添加说明。即便是抱怨笑话太蹩脚,
也胜过毫无感触。

9 动手实践。
在新设计的项目中应用学到的知识,抑或改造
既有的项目。只要动手实践就好,这样可获得一
些做练习和活动时无法获得的经验。你需要的
只是铅笔和需要解决的问题——一个可能受益于
JavaScript的问题。

10 睡好觉。
为学习编程,需要在大脑中建立大量新的关联。
多睡觉吧,这大有裨益。

01 JavaScript速览-进入JavaScript的世界

如何将JavaScript代码加入网页

使用

如何编写语句
你编写语句。每条语句都指定了计算的一小部分,而所有
语句一起给网页添加行为。
变量和值
语句通常包含变量,变量用于存储值,什么样的值呢?
数字,字符串,布尔,对象,数组

var var winners = 2;
var name = "Duke";
var isEligible = false;//将值false赋给变量isEligiblee。 ture/false被称为布尔值。布尔值无需用引号括起。

不管存储的是哪种类型的值,变量的创建方式都相同。

声明变量时,以var关键字打头,接下来给变量指定名称,加上等号和值,赋值语句总是以分号结束。
var winners = 2;

如何给变量命名

  1. 以字母、下划线和美元符号打头。
  2. 然后使用任何数量的字母、数字、下划线或美元符号。
    不能使用任何内置关键字,如var、function、false等,以免让JavaScript感到迷惑。
    下面列出了JavaScript关键字
break
case
catch
class
const
continue
debugger
default
delete
do
else
enum
export
extends
false
finally
for
function
if
implements
import
in
instanceof
interface
let
new
package
private
protected
public
return
static
super
switch
this
throw
true
try
typeof
var
void
while
with
yield

关键字是JavaScript保留字,JavaScript将其用于特殊目的。

可以将关键字用作变量名的一部分,只要变量名不与关键字完全相同就行,编写代码时应确保其清晰

JavaScript区分大小写,在JavaScript中,变量名、关键
字和函数名等几乎所有一切的大小写都很重要,因此请务必注意大小写。

  • 选择有意义的名称
  • 创建由多个单词组成的变量名时,采
    用骆驼式拼写法。
  • 除非有充分的理由,否则不要使用
    以_ 或$打头的变量名。
变量名_ m、$、r或foo对你来说也许是有意义的,用于表示类似于喷火的双头龙(two-headed dragon with fire)采用骆驼式拼写法即可,即将每个单词
的首字母大写(第一个单词除外):twoHeadedDragonWithFire。以 $ 打 头 的 变 量 名 通 常 保 留 用 于JavaScript库;有些作者根据各种约
定使用以_ 打头的变量名。

有趣的语法

  • 每条语句都已分号结尾
    x = x + 1;

  • 单行注释以两个斜杠打头注释只是用于向你或其他开发人员解释代码,它们不会执行。
    // I'm a comment

  • 空白无关紧要(几乎在什么地方都是如此)
    x = 2233;

  • 将字符串用双引号括起(也可使用单引号,这两种方式都可行,只要统一即可)
    "You rule!" 'And so do you!'

  • 不要用引号括起布尔值true和false
    rockin = true;

  • 声明变量时,可以不给它指定值。
    var width;

  • 不同于HTML标记,JavaScript区分大小写,这意味着大小写很重要。
    counter和Counter是两个不同的变量。

运算符=用于赋值,而运算符==用于判断相等性。
运算符的运算顺序是从右向左 赋值(左边只能是变量不能表达式)

x = a+b;//错误赋值
a+b = x;//正确赋值

JavaScript提供了多种反复执行循环代码的方式:while、for、for in和forEach。

while()循环
以关键字while关键字打头,
语句包含一个布尔表达式,我们称之为条件测试(简称为条件),如果条件为true ,就执行代码块中所有的代码。

代码块是什么呢?用花括号({ })括起来的代码。

如果条件为true ,则执行代码块,并回过头来再次检查条件。如果条件为false ,就结束循环。

while (juggling) {keepBallsInAir();
}

在 if 语句中使用布尔表达式来进行决策。仅当 if 语句的条件测试为 true 时,才
会执行其代码块

函数alert接受一个字符串,并在浏览器中显示一个包含该字
符串的弹出式对话框。

if (scoops < 3) {alert("Ice cream is running low!");
}

在if语句中,还可添加一个或多个else if 语句,以执行多重检查
可根据需要添加任意数量的else if语句,以检查多个条件。每条else if语句都有其代码块,该代码块将在条件为true时执行。

if (scoops >= 5) {alert("Eat faster, the ice cream is going to melt!");
} else if (scoops < 3) {alert("Ice cream is running low!");
}

可根据需要将任意数量的 if/else 语句串接起来,还可在最后添加一条包罗万象的 else语句,以处理所有条件都不满足的情形,

if (scoops >= 5) {alert("Eat faster, the ice cream is going to melt!");
} else if (scoops == 3) {alert("Ice cream is running low!");
} else if (scoops == 2) {alert("Going once!");
} else if (scoops == 1) {alert("Going twice!");
} else if (scoops == 0) {alert("Gone!");
} else {alert("Still lots of ice cream left, come and get it.");//如果上述条件都不满足,就
执行这段代码。
}

代码块是什么?
从语法上说,代码块是放在花括号内的一组语句,可以只包含一条语句,也可以包含任意数量的语句。代码块中的所有语句被视为一个整体,要么都执行,要么都不执行。

布尔值(boolean)是如何得名的?
布尔值是以发明布尔逻辑的英国数学家George Boole命名的。在英文中,boolean常被写作Boolean,旨在指出这种变量类型是以George Boole命名的。

创建提醒框
函数alert。你只需调用函数alert并指定一个包含提醒消息的字符串,浏览器就会在一个漂亮的对话框中显示这条消息。仅当你要停止一切并提醒用户时,才应使用它。

直接写入文档
函数document.write将任何HTML和内容写入网页,这虽然很常见,但通常被认为是一种糟糕的做法。

试用控制台
函数console.log,传入要写入的字符串。可将console.log视为杰出的故障排除工具,但用户通常看不到控制台日志,因此这并非与用户交流的有效方式。

直接操作文档
这是最佳的方式,你应尽量使用这种方式来与网页和用户交互。使用JavaScript可以访问网页,读取和修改其内容,甚至修改其结构和样式!这些都是利用浏览器的文档对象模型实现的。

console.log使用它来查看代码的输出以及调试代码。原理如下:

var message = "Howdy" + " " + "partner";
console.log(message);


可将console.log视为杰出的故障排除工具,但用户通常看不到控制台日志,因此这并非与用户交流的有效方式

打开控制台
不同浏览器的控制台实现存在细微的差异,对于如何在各种主流浏览器中访问控制台,请参阅http://wickedlysmart.com/hfjsconsole。


如何将JavaScript代码加入网页(细数各种方式)
你已经知道可以使用<script>标签将JavaScript代码添加到网页的<head><body>元素中,但还
有另外两种在网页中添加JavaScript代码的方式。

可将代码嵌入<head>元素中。
也可以将代码内嵌在网页的<body>元素中。
还可将代码放在独立的文件中,并在<head>中链接该文件。




运算符=用于赋值,而运算符==用于判断相等性。
也就是说,给变量赋值时使用一个等号,判断两个值是否相等时使用两个等号。

02 编写代码-更进一步

prompt浏览器内置函数,用来获取用户输入 显示对话框包含你指定的字符串 还提供了让用户响应的区域 作为函数调用结果以字符串的形式返回 如果用户取消或没有输入返回null
下面是工作原理:

prompt("Ready, aim, fire! (enter a number 0-6):");

编写程序前,使用伪代码粗略地描绘一下程序需要完成的任务

伪代码(pseudocode)。伪代码介于JavaScript代码和程序的自然语言描述之间。
无需编写实际代码就能彻底弄清楚程序的运行过程(你用中文或英文或其它方式写下的运行过程的代码-顺序-循环-判断) (伪代码由两部分组成,第一部分描述需要的变量 第二部分描述了程序的逻辑 变量指出了要在代码中记录哪些东西 而逻辑指出了要创建这个必须如实地实现哪些代码)

如果你没有给变量指定初始值,JavaScript将给它指定默认值undefined

有效性测试。你知道要检查输入是否为0~6,但这个条件到底是如何测试这一点的呢?下面来详细解释。

if (guess < 0 || guess > 6) {...}

无限循环 循环必须包含条件测试,只要循环测试为true,循环就继续。如果代码没有可导致条件测试最终变为false的因素,循环将不断进行下去,直到浏览器或重启计算机

布尔运算符用于结果为true或false的布尔表达式中。有两种布尔运算符:比较运算符逻辑运算符,布尔运算能编写更复杂的逻辑语句。

逻辑运算符 将两个布尔表达式合二为一,得到一个布尔结果(true或false)
|| 表示OR(或) 只要有一个为true,整个条件为true,两个测试都为false,则整个条件为false

if (guess < 0 || guess > 6) {
alert("Please enter a valid cell number!");
}

&& 表示AND(与) 仅当两个测试都为true时,结果才为true

if (inStock == true && onSale == true) {
// 好像很划算!
alert("buy buy buy!");
}

!表示NOT(非) 仅当表达式为false时,结果才为true

if (inStock != true && onSale != true) {
// 好像很划算!
alert("buy buy buy!");
}

使用()对条件进行编组先获得运算结果

if (inStock == true && (onSale == true || price < 60) ) {
// 好像很划算!
alert("buy buy buy!");
}

随机数函数Math.random 返回一个0~1(包括0但不包括1)的随机数

var randomLoc = Math.random() * 5;//如果将随机数乘以5 ,将得到一个0 ~ 5 (不包括5 )的数字,
如0.139 83 、 4.231 、 2.3451或4.999 。
//Math.random()*1=0.999999(最大随机数为)0.11(最小随机数)

向下取整函数Math.floor 将小数取最为接近的(小于或等于)整数

var randomLoc = Math.floor(Math.random() * 5);//我们可以使用Math.floor将数字向下圆整为最接近的整数。
//Math.floor(45.95)=45   Math.floor(-45.05)=46


质量保证(quality assurance,QA)是指对软件进行测试以找出其中的缺陷。

if  (inStock == true) {...}
//可缩写为
if  (inStock) {...}

03 函数简介-养成函数思维

函数(function) 可编写适用于各种不同环境的代码,可反复重用(reuse)代码块且管理起来容易,还可以将通用代码抽取出来,给它一个简单的名称,是JavaScript编程风格的核心。可将函数放在JavaScript文件的任何地方

function bark(name, weight) {
if (weight > 20) {
console.log(name + " says WOOF WOOF");
} else {
console.log(name + " says woof woof");
}
}





可以向函数传递哪些东西 通过实参传递任何JavaScript值。如字符串、布尔值或数字。还可以将变量作为实参传递,这种情况其实更常见。

saveMyProfile("krissy", 1991, 3.81, false);function saveMyProfile(name, birthday, GPA, newuser) {
if (birthday >= 2004) {
// 处理孩子的代码
}
// 这个函数的其他代码
}


形参和实参的差别,它们指的是同一样东西吗?
不,它们是不同的。
定义函数时,可定义一个或多个形参
调用函数时,你使用实参进行调用
因此,形参只需定义一次,但你可能会多次调用函数,而且每
次提供的实参可能不同。

JavaScript按值传递实参 这意味着传递的是实参的副本
明白JavaScript如何传递实参很重要。JavaScript按值传递实参(pass-by-value),这意味
着把每个实参的值复制给形参。要了解这是如何传递的,来看一个简单的示例。

向函数传递实参时,首先复制其值,再将这个值赋给相应的形参。

按值传递的真正意义在于,在函数中修改形参的值时,只会影响形参,而不会影响传递给函数的变量。
在函数中处理形参时,其影响范围将限制在函数中。

函数还可返回值

return语句的函数的执行过程

函数剖析

在函数内声明变量时,也可以初始化新变量,从这种意义上说,它们与函数外的变量声明相同。
如果变量是在函数外声明的,就可在代码的任何地
方使用它;如果变量是在一个函数中声明的,就只
能在这个函数中使用它。这被称为变量的作用域(scope)。
作用域分两种:全局(global)和局部(local)。

全局变量和局部变量

前面说过,应该给变量指定有意义的名称,可刚才你却使用了变量名i,其含义好像不是很明确。
问得好。将i用作迭代变量的做法历史悠久。这种约定始于空间有限的年代(如使用打孔卡编写代码的年代),那时使用简短的变量名有好处。当前,所有的程序员都知道这种约定。你还会经常看到这样使用j、k乃至x和y的做法。这是选择有意义的变量名这种最佳实践的为数不多的例外之一。

了解局部变量和全局变量的作用域
变量的定义位置决定了其作用域,即变量在代码的哪些地方可见,哪些地方不可见。

全局变量的寿命与网页一样长。 全局变量在JavaScript代码加载到网页之后降生,并在网页消失后死去。重新加载网页时,将销毁并重新创建所有的全局变量。
局部变量通常在函数结束时消失。 局部变量是在函数被调用后创建的,并一直活到函数返回(无论函数是否返回值)。然而,在局部变量的大限到来前,可从函数返回它们的值。

千万别忘了声明局部变量
如果你使用未声明的变量,它就会是全局的。

如果局部变量与全局变量同名,结果将如何?
它将“遮住”(shadow)全局变量。
这是什么意思呢?假设你定义了全局变量beanCoun-ter,然后声明了如下函数:

var beanCounter = 10;//有一个名为beanCounter的全局变量function getNumberOfItems(ordertype) {
var beanCounter = 0;//还有一个名为beanCounter的局部变量。
if (ordertype == "order") {
// 对bean Counter做些什么
}
return beanCounter;
}

如果你这样做,每次在函数中使用beanCounter时,引用的都是局部变量,而不是全局变量。因此,我们说局部变量遮住了全局变量。换句话说,我们看不到全局变量,因为它被局部变量挡住了。

请注意,全局变量和局部变量不会相互影响:如果你修改其中的一个,对另一个不会有任何影响。它们是彼此独立的变量。



该在什么地方声明函数。应将所有的函数都放在JavaScript文件开头吗?
实际上,可将函数放在JavaScript文件的任何地方。
浏览器分两遍读取网页:第一遍读取所有的函数定义,第二遍开始执行代码。这让你可以将函数放在文件的任何地方。

在开头声明全局变量!
函数喜欢扎堆。
在函数开头声明全局变量。

04 让数据排排坐-数组

05 理解对象-对象镇之旅

06 与网页交互-了解DOM

07 类型、相等、转换-系统地讨论类型

基本类型:数字、字符串、和布尔值等级低基本类型
对象(用于表示问题空间中事物的高级对象):Document
function:类型是根据函数return的值的类型,没有return语句,函数返回undefined
真值和假值 除了假值(false)其他都是真值。如果为假值函数将不执行或console控制台报错。
假值有5个:undefined、null、""、0、NaN

属性length 指出了字符串包含多少个字符。length-1获取最后一个元素

字符串有点像数组,其中每个字符都有索引,索引从0开始(与数组一样)

字符串方法
charAt() 接收一个整数的参数(从0到length()-1)并返回一个字符串,其中包含指定索引位置的字符。如果索引大于或等于length的长度将返回0

indexOf() 将一个字符串作为参数,并在字符串中该参数首次出现的位置返回该参数中第一个字符的索引,如果没有找到指定字符串将返回索引-1。可传2个参数:1字符串 2指定查找位置
substring() 将两个索引作为参数,取并返回这两个索引之间的子串。(不包括最后一个指定位置子串)

split() 将一个分隔符作为参数,并根据这个分隔符将字符串分割成多个部分(返回包含的数组)

08 综合应用-编写一个应用程序

09 异步编码-处理事件

10 函数是一等公民-自由的函数

变量名和函数名不要相同

//错误示范
var member = 'var'; member function(){console.log("fun"); return "f"}
console.log(member); // member的结果为变量member的值var
console.log(member()); // member()的结果为member函数返回的字符串"f"
//正确示范
var member ='var'; function getMember (){console.log("fun")}
console.log(member); //member的结果为变量member的值var

到目前为止,我们都像下面这样声明函数:
一个标准的函数声明,由关键字function、函数名、形参和代码块组成。

function quack(num) {for(var i=0; i<num; i++) {console.log("Quack!");}
}
quack(3);

关键字function还有另一种用法

var fly = function(num){for(var i=0;i<num;i++) {console.log("Flying!");}
}
fly(3);

在语句(如赋值语句)中以这样的方式使用关键字function时,创建的是函数表达式

请注意,不同于函数声明,上述函数没有名称。另外,该表达式的结果是一个值,这个值被赋给变量fly。这是一个什么样的值呢?我们将它赋给变量fly,然后调用了它,因此它肯定是一个指向函数的引用
顾名思义,函数引用就是指向函数的引用。你可以使用函数引用来调用函数,还可以将它们赋给变量、存储在对象中、传递给函数或从函数返回它们(就像对象引用一样)。

函数声明和函数表达式

无论你是用函数声明还是函数表达式,得到的都是函数。乍一看函数声明和函数表达式差别不大,但实际上它们存在根本性差别。

浏览器扫描代码,在其中查找函数声明,创建相应的函数,并将得到的函数引用赋给与函数同名的变量。

处理完所有函数声明后,浏览器回到代码开头,开始从头到尾的顺序执行代码。






结果为一个值的任何东西都是表达式。而函数表达式的结果是一个变量引用。
函数声明为何不是函数表达式?函数声明是一条语句。可以认为它包含一条隐藏的赋值语句,这条语句将函数引用赋给一个变量。函数表达式不自动将函数引用赋给任何变量,你必须显式地这样做。

函数声明和函数表达式创建的函数,调用方式完全相同。

无论是使用函数声明还是函数表达式,最终都将得到一个函数,但它们之间存在一些重要的差别。

使用函数声明时,函数将在执行代码前创建;而使用函数表达式时,函数将在运行阶段执行代码时创建。

使用函数声明时,将创建一个与函数名同名的变量,并让它指向函数;而使用函数表达式时,通常不给函数指定名称,因此要么将函数赋给一个变量,要么其他方式使用函数表达式 (本章后面将讨论这些使用函数表达式的方式。)

函数声明函数表达式定义的函数,得到的都是指向这个函数的引用

引用就是引用不管以什么方式创建。

函数在javascript中是一等公民

一等值:在编程语言中,可像对待其他任何值一样对待的值,包括赋给变量、作为实参传递给函数以及从函数中返回。

对于一等值你可以做如下事情:
将其赋给变量或存储在数组和对象等数据结构中
将其传递给函数
从函数中返回它们

11 匿名函数、作用域和闭包-系统地讨论函数

函数的另一面
匿名性
所谓匿名(anonimous),指的是没有名称的函数。使用函数声明定义函数时,必须给它指定名称,但使用函数表达式定义函数时,不必给它指定名称。

如何使用匿名函数(匿名函数表达式)
匿名函数提供了一种简化这些代码的途径。匿名函数是没有名称的函数表达式,用于通常需要函数引用的地方。

function handler() {arert("Yeah, that page loaded!")} //函数声明
window.onload=handler;//函数赋给window.onloadfunction() {arert("Yeah, that page loaded!")};//没有名称的 函数表达式
window.onload=function() {arert("Yeah, that page loaded!")}//赋给window.onload

对象中的方法函数也是匿名函数


函数是在什么时候定义的?这要看情况
浏览器分两遍来处理JavaScript代码:第一
遍,浏览器分析所有的函数声明,并定义这些函数声明创建的函数;第二遍,浏览器按从上到下
的顺序执行代码,并定义函数表达式创建的函数。有鉴于此,使用函数声明创建的函数是在使用
函数表达式创建的函数之前定义的,而这又决定了你可在什么时候和什么地方调用函数。


可将函数声明放在任何地方(代码的开头、末尾、中间),且可在任何地方调用它们。在代码的任何地方,函数声明创建的函数都是已定义的,这被称为提升(hoisting).
函数表达式显然不同,因为它创建的函数要等到它执行后,才被定义。

函数对作用域的影响
在代码顶层定义的函数是全局的,而在函数中定义的函数是局部的。

词法(lexical):意味着只需查看代码的结构就可确定变量的作用域,而不是等到代码执行时才明白

每个函数都有与之相关联的环境,其中包含它所处作用域内的局部变量。所有局部变量都存储在一个环境(environment)中



闭包:名词,指的是函数和引用环境 。(函数和环境一起被称为闭包)
自由变量:指的是不是在本地作用域内定义的变量。




闭包包含的是实际环境,而非环境的副本







12 高级对象构造技巧-创建对象

对象构造函数(简称构造函数):可更轻松地创建对象且确保所有对象都包含相同的属性和方法。

要使用构造函数分两步:先定义一个构造函数,再使用它来创建对象。

//创建构造函数
function Dog (name,breed,weight) {this.name = name;this.breed = breed;this.weight = weight;
}

//使用构造函数 用new 函数名 来调用构造函数
var fido = new Dog("Fido","Mixed",38);//使用运算符new 再调用构造函数Dog 然后指定实参
//这条语句执行完毕后,变量fido将包含一个指向新小狗 对象的引用
//不断地创建小狗对象
var fluffy = new Dog("Fluffy","Poodle",30);
var spot = new Dog("Spot","Chihuahua",10)



对象构造函数返回的如果不是this,这将导致构造函数不返回它创建的对象。

构造函数名的首字母大写,能让开发人员一眼就看出那些函数是构造函数,哪些函数是常规函数。问什么区分这一点,因为调用构造函数需要使用运算符new。








内置构造函数
JavaScript自带了一系列构造函数,可用于实例化一些便利的对象。

var now = new Date();//新建一个表示当前日期和时间的日期对象。

构造函数Date() 返回一个表示本地当前日期和时间的Date实例。有了日期对象后,便可使用其方法来操作日期和时间,还可获取其各种属性。

var dateString = now.toString();//返回一个表示日期的字符串,如“Thu Feb 06 2014 17:29:29 GMT-0800(PST)"
var theYear = now.getFullYear();//返回日期中的年份
var theDayOfWeek = now.getDay();//返回一个数字,指出日期对象表示的是星期几,如1(表示星期一)

通过向构造函数Date传递额外的实参,可轻松地创建表示日期时间的日期对象。例如,要创建一个表示1983年5月1日的日期对象可像下面这样做:

var birthday = new Date("May 1, 1983");//可像这样向构造函数传递一个表示日期的简单字符串

还可在传入的字符串中包含时间,从而创建更具体的日期对象

var birthday = new Date("May 1,1983 08:03 pm");//在传入的字符串中包含时间

这里只简要地介绍了日期对象,要详尽地了解其属性和方法,请参考《JavaScript权威指南》

内置函数:数组对象。本书前面创建数组时,使用的都是方括号表示法([1,2,3]),但也可以使用下面的构造函数来创建:

var emptyArray = new Array();//创建一个长度为零的空数组
emptyArray[0] = 99;//给数组添加元素//创建特定长度的数组对象。假设要创建一个包含3个元素的数组:
var oddNumbers = new Array(3);
//赋值
oddNumbers[0] = 1;
oddNumbers[2] = 3;
oddNumbers[3] = 5;//reverse()按照相反的顺序排列数组的所有元素(现在数组oddNumber依次包含5、3和1)。请注意,这个方法修改原始数组。
oddNumbers.reverse();
//join方法将数组oddNumbers中的的值合成一个字符串(这里在值之间加上-),并返回这个字符串。因此这将返回字符串“5-3-1”
var aString = oddNumbers.join("-");
//every方法将一个函数作为参数;对于数组中的每个值,都调用这个函数,并判断该函数返回的值是true还是false.如果对于所有的元素,这个函数都返回true;那么方法every将返回true.
var areAllOdd = oddNumbers.every(function(x){return ((x % 2) !== 0);});

要全面了解数组对象,请参阅《javascript权威指南》

本书前面创建数组时,使用的都是方括号表示法([]),实际上是直接使用构造函数Array的简写。请看下面两种创建空数组的方式,它们是等价的。

var items = new Array();
var items = [];var items = ["a","b","c"]//我们称之为数组字面量语法var items neew Array("a","b","c");//构造函数的方式简写

需要创建在运行阶段确定的特定长度的数组,再在该数组中添加元素时,使用构造函数很方便,如下所示:

//这些代码可能创建一个很大的数组,其长度要等到运行阶段才知道。
var n = getNumberOfWidgetsFromDatabase();
var widgets = new Array(n);
for (var i=0;i<n;i++){widgets[i] = getDatabaseRecord(i)};

创建简单数组时,使用数组字面量语法的效果很好,你可以根据需要使用其中任意一种方式,也可结合使用这两种方式。

其他内置对象

JavaScript还包含很多其他的内置对象,它们有时候可能为你提供很大的便利。下面列出了其中的几个。如果你对其他内置对象感兴趣,可在网上搜索"JavaScript标准内置对象"

Object //构造函数object来创建对象。与数组一样,对象字面量表示法{}与new Object()等价。这将在本书后面更详细地介绍。
Math //这个对象包含用于执行数学运算任务的属性和方法,如Math.PI何Math.random()
RegExp // 这个构造函数可创建正则表达式,让你能够在文本中搜索非常复杂的模式。
Error //这个构造函数创建标准错误对象,为你在代码中捕获错误提供了极大的便利。


13 使用原型-超强的对象创建方式

JavaScript没有传统的面向对象模型,既从类创建对象的模型。事实上,JavaScript根本就没有类。在JavaScript中,对象从其他对象那里继承行为,我们称之为原型式继承(prototypal inheritance)或基于原型的继承。





































headFirst JavaScript 程序设计笔记相关推荐

  1. HeadFirst JavaScript读书笔记

    1. 存储数据--HeadFirst JavaScript第二章 2. 探索客户端--HeadFirst JavaScript第三章

  2. JavaScript 高级笔记

    JavaScript 高级笔记 1. 基础总结深入 1.1 数据类型 1.1.1 数据类型分类 1.1.2 数据类型判断 1.1.3 数据类型相关问题 1.2 数据.变量与内存 1.2.1 什么是数据 ...

  3. JavaScript学习笔记之对象及继承

    JavaScript学习笔记之对象及继承 对象属性 ES5中有两种属性,数据属性和访问器属性. 数据属性包括[[writable]](能否修改属性的值).[[value]]等等: 访问器属性包括[[C ...

  4. JavaScript基础笔记集合(转)

    JavaScript基础笔记集合 JavaScript基础笔记集合   js简介 js是脚本语言.浏览器是逐行的读取代码,而传统编程会在执行前进行编译   js存放的位置 html脚本必须放在< ...

  5. Java程序猿的JavaScript学习笔记(12——jQuery-扩展选择器)

    计划按例如以下顺序完毕这篇笔记: Java程序猿的JavaScript学习笔记(1--理念) Java程序猿的JavaScript学习笔记(2--属性复制和继承) Java程序猿的JavaScript ...

  6. Java程序猿的JavaScript学习笔记(汇总文件夹)

    最终完结了,历时半个月. 内容包含: JavaScript面向对象特性分析,JavaScript高手必经之路. jQuery源代码级解析. jQuery EasyUI源代码级解析. Java程序猿的J ...

  7. JavaScript学习笔记(五)

    JavaScript学习笔记(五) ①Array类 本地对象 ②Date类 ①Global对象 对象的类型   内置对象 ②Math对象 宿主对象 今天继续学习JS中的对象,昨天内置对象Global对 ...

  8. JavaScript学习笔记(备忘录)

    JavaScript学习笔记(备忘录) ===运算符 判断数值和类型是否相等.如: console.log('s'==='s') //输出trueconsole.log('1'===1) //输出fa ...

  9. Java程序猿的JavaScript学习笔记(10—— jQuery-在“类”层面扩展)

    计划按例如以下顺序完毕这篇笔记: Java程序猿的JavaScript学习笔记(1--理念) Java程序猿的JavaScript学习笔记(2--属性复制和继承) Java程序猿的JavaScript ...

最新文章

  1. 众方网络电话VOIP FREEGO EIS系统命令
  2. 黑客(续) (压位高精+状压dp)
  3. 这所双非高校硕士生一作发Science!系学校上半年第13篇CNS!
  4. mysql中的派生表
  5. iphonex价格_iPhone X竟然可以换LCD屏幕,价格只要一半
  6. hanlp源码解析之中文分词算法
  7. django xadmin 默认密码_Django的认证系统
  8. 16个UEFI固件漏洞影响惠普多个产品线,其中1个影响无数厂商
  9. 从C#程序中调用非受管DLLs
  10. 36. 理解copy_if算法的正确实现
  11. 计量经济学计算机实验报告,综合实训报告范文
  12. Arduino--DS3231时钟模块
  13. windows副本不是正版怎么解决_黑屏、蓝屏、卡顿、死机怎么解决?教你免重装Windows解决问题...
  14. win10重装系统后连不上公司服务器,电脑重装win10系统连不上网,怎么办?
  15. C#基于RealPlayX.ocx视频监控整合程序
  16. 三十六计第三计 借刀杀人
  17. Python实现和弦查询器(钢琴)
  18. 如何使用Graylog来收集日志?
  19. c++类和对象(类的概念)
  20. Windows 鼠标右键注册表位置

热门文章

  1. 程序员必备的60个网站,解决你编程的所有问题
  2. [Java]给出一百分制成绩,要求输出成绩等级’A’,’B’,’C’,’D’,’E’
  3. 2012百度校园招聘笔试试题
  4. 林云挂余量机器人使用教程
  5. 6-6 打印一个月的日历(日历) (30分)
  6. python 爬取bilibili番剧排行榜
  7. 设备驱动程序安装的重要文件
  8. Web寻梦狮ionic1实战1-环境搭建及项目介绍
  9. java 读取ppt文件_Java 读取PPT文档属性
  10. 2019最好用的谷歌扩展工具