JavaScript系列教程-JavaScript语言教程

概述
JavaScript是一个基于对象的面向对象语言,同时是一个函数式语言。
跟我们常见的基于类的面向对象语言不同,JavaScript是基于对象的。这意味着JavaScript没有类的存在,只有对象的存在。这个同时也避免了基于类的面向对象语言学理上对于元类的要求,那会导致无限递归。原因是:类作为一种特殊的对象,其也应该有模版,也就是元类,依次类推下来。没有了类,这就要求我们的思路进行完全的转变。我们不再有能力定义一个对象的模版,然后具体的构造出来一个对象。我们自然也丧失了类继承这种方便快捷的重用手法。这会让很多没有基于对象的OO语言背景的程序员感觉困惑、不满和失望。但是,基于对象的面向对象才是真正纯粹的面向对象。只有对象和消息,这是OO的荣光。
JavaScript语言同时是一个函数式语言。它的函数也是一个对象。可以被当作参数传递,可以被当作返回值传递,可以用在任何别的对象可以使用的地方。一定不要小看这个能力,我会让大家看到它的强大之处的。
JavaScript 语言的继承不再是类继承,而是原型继承。不再存在根据类型(因为没有类型了,全是对象)创建对象的过程,而是以一个对象为原型创建另一个对象。 JavaScript的继承依据这个原型链形成森林:)。在JavaScript中,一切都是对象(我不想纠缠引用,因为它不关键)。所有的对象都可以不需要声明而直接使用,对象在JavaScript中其实是一个Hashtable,也就是一个名值对集合。可以通过名字引用其值。
比如:
x.text = "384";
x.dir = 3;
y = x.text;
其实obj.prop是obj["prop"]的简写,以便于看起来更像传统的对象,而obj["prop"]这种写法更清楚地表达了对象就是一个hashtable的事实。
所有对象的属性都可以动态的增删,增加就是简单的引用,如果原来不存在,那么就会创建这么一个属性,删除就是delete后跟对象属性,比如:delete x.text;这表明x的text属性不存在了,下一次使用的时候会创建一个新的。
现在介绍几种典型的literal。
所有的数字,包括整数和实数,都采用数学中常用的表示方法,毋用多说。用""或者''表示字符串,这个也是常见。用{prop:value, prop:value, ……}来表达对象,这个用法非常常见,希望注意。对于数组,用[element, element, ……]来表达。对于函数对象,写法如下:function(...){...},其中()中是函数的参数,{}中是函数的内容。
再强调一遍,它们都是对象。
x = {name: "张三", age: 28, 职业: '挨踢人士'};
y = [38, {text: "....", id: '23432', tag: 'div'}, "12345,shangshanda"];
z = function(x, y){return x + y};
大家仔细分析一下上面的代码,深入理解对象在JavaScript中的作用。
继承
继承是在基于类的面向对象语言中耳熟能详的概念,但是JavaScript没有类,其继承也就完全变成另一种风格了。上面说过,JavaScript中的继承是原型继承,是以一个对象为原型创建另一个对象。那么怎么表达这种关系呢?且看:
x.prototype = y;
这儿就表明了,x是以y为原型的。因此,x现在,至少是现在,跟y是一模一样的。别忘了,我们任何对象的属性都是可以动态增删的,所以,x在以后跟y完全不一样也没有什么值得大惊小怪的。
构造子
JavaScript 没有类,有时候我们期待能够抽象的描述一个对象原型,然后依次为基础创建出大量类似的对象,这就是劳构造子大驾的时候了。构造子就是一个函数对象。当它被放在new这个关键字后面的时候,运行时就知道这个函数是被当作一个构造子使用的。这样,我们的对象就是以该函数为原型构造出来的。其实, JavaScript语言内定了几个构造子,也就是我们所谓的JavaScript内建类型了(由此话可以看出我受基于类的面向对象语言的毒害有多深)。常用的有Number,Date,RegExp,Object,String,Error,……Math,Global。其中后两个不需要用new以它们为原型构造一个新对象,而且也不能如此。
进一步的继承
还是上面说的,继承是原型继承,是以prototype这个保留字完成的。但是继承还有一些需要讨论的东西。
并不是全部都继承。这是一个比较让人惊奇的地方,但是,这也是JavaScript用来表达某些意图必不可少的一个机制。
现在我们看看,究竟会继承什么呢?
x.prototype = new Object(); //如果这儿你没有看懂,证明上面的继承和构造子你没有仔细看,敬请仔细看看,说得非常详细了。
我们说x继承自Object,或者说,x以Object为原型。或者用更基于类的面向对象的术语来说,x是Object类的对象。那么,x是不是从 Object继承了所有的properties呢?不是。x从Object那里继承了那些被规定为原型的属性。具体的说,就是那种 Object.prototype.nnn,向这样的nnn才会被x继承。例示之:
Object.name = "obj";
Object.prototype.class = "Object";
x.prototype = new Object();
这时候,x拥有class属性,但是没有name属性。再一次重申,对象的属性是可以动态的添加删除的。
值得一提的是:所有的用户定义(或者创建)的对象,都自动继承自Object。
关于全局和局部变量
没有任何标志的变量就是全局变量,变量第一次出现时,前面有var关键字的就是局部变量。局部变量的作用于局限在自己的scope之内。一个{}定义一个 scope。所有的对象,函数和代码片断,如果不在某个scope之内,就作为Global对象的属性出现。Global对象的属性可以直接用 propName引用,也就是说,可以省略Global.propName中的Global和.。
表达式和语句
JavaScript几乎支持所有C++/Java的表达式方式。值得注意的是void也作为一个运算符存在。void expr;表示执行expr,完成其副作用,但是丢弃其结果。对于语句,也跟Java/C++之类的语言大同小异。需要注意的是for(.. in ..)这种对于容器的遍历手法。另一个比较陌生的语句是从VB/Delphi借鉴来的with语句,用with(obj){properites access}这种方式方便的访问对象的属性。另外值得注意的是JavaScript拥有完整的异常处理机制,try catch finally throw。比C++方便。
我前面说了JavaScript预定义了一批构造子,其实这些构造子都可以看作是Global对象的属性。 JavaScript中对象的属性都可以用一些特性来描述,比如:是否可以被列举,是否是只读的,是否可以被删除等等。JavaScript程序在运行时,还会有些一些内部对象,包括Activation等,在程序中是不会直接引用的,但是JavaScript程序解释器用它来记录程序执行的上下文。
几个特殊的对象
this 是一个特殊的对象,它用来表达进入执行上下文时,那个拥有这个程序段的对象。arguments对象是参数对象,在一个函数执行中,我们可以使用这个对象获知该函数的各个参数以及其他相关信息。this和arguments是让你的程序拥有弹性的强大武器,不可不理解,不可不用啊。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值