吃透javascript

web开发肯定离不开javascript ,而且js也在不断的发展, 目前流行的大家都在努力的学习,当然我也在学习这样一条艰巨的道路上,对于ext ,jquery ,我们都很想吃透他们,但是我还是觉得先把最原始的javascript吃透, 因为这才是最这些框架的低层。 只有最底层的吃透了才能真正的掌握这些框架 , 不多说了 , 我决定发在把js拿出来进一步研究一下。

在说javascript前,我想说一下javascript 也算一种面向对象的语言,
一般的面向对象oop ,object oriented language 又四大特征:
1,封装,2 继承 3 ,多态 4,抽象
这些都可以模拟出來, 现在不是很多开源的框架吗,都把javascript封装成类库extjs和jquery咯,

说到javascript 最大特点就是简单, 和java c++ 相比, 这些强语言,编译型语言, javascript是弱语言,解释型语言了, 什么叫弱语言,解释型预言? 大多数语言执行要先编译成机器语言,编译型语言在多次执行的时候只要编译一次,这样不能动态的添加属性和方法, 是因为他们在编译前必须要定义好,二ECMA把所有的javascript都是动态绑定属性的 ,每次执行都要解释翻译一次,虽然在多次执行情况下,效率会比编译型的慢,但是比较灵活宽松。java虽然也是解释型语言,但是它是强语言,来实现动态加载属性和方法就比较困难, 需要装饰模式: 先创建一個实体,在把数据中的map的name和key都考到这个实体,再这个实体上增加, 这样的开销肯定是很大的。

开始吧:

[b]数据类型[/b]: javascript的数据简单类型只有 number string undefined null boolean 这五种, 记住了,仅仅就五种了, 其中复杂数据只有一种就是object ,所有的数据类型加起来也就 6种。

[b]一 。先说说简单数据类型吧:[/b]

undefined: 代表一切未知的事物,啥都没有,无法想象,代码也就更无法去处理了。

注意:typeof(undefined) 返回也是 undefined。

可以将undefined 赋值给任何变量或属性,但并不意味了清除了该变量,反而会因此多了一个属性。


null: 有那么一个概念,但没有东西。无中似有,有中还无。虽难以想象,但已经可以用代码来处理了。

注意:typeof(null)返回object,但null 并非object,具有null 值的变量也并非object。


boolean: 是就是,非就非,没有疑义。对就对,错就错,绝对明确。既能被代码处理,也可以控制代码的流程。


number:大小和次序分明,多而不乱。便于代码进行批量处理,也控制代码的迭代和循环等。

注意:typeof(NaN)和typeof(Infinity)都返回number 。 NaN 参与任何数值计算的结构都是NaN,而且 NaN != NaN 。 Infinity / Infinity = NaN 。


string: 面向人类的理性事物,而不是机器信号。人机信息沟通,代码据此理解人的意图等等,都靠它了。



javascript里没有类这个概念, 但是我们真的需要类吗??? 在javascript世界里可以没有类!!!



还记得类的定义吗:类是对某个对象的定义。 对。 就是定义,比如在java中你要使用一個对象 都要预先定义个一個类,

才能通过new关键字 ,实例出对象。 但是javascript你会发现在使用对象的时候,根本不需要对 对象的定义。

比如代码:

var  ob={};//空的对象

ob.name="object";

ob.age=4;

alert(ob.name+''+ob.age);

看到了,当你需要一個对象时, 对象的属性是你直接动态添加的。

这和java c# 一些编程预言就很不一样.



[b]二,javascript 的最神奇的就是 function和object 超然的结合。[/b]



function 可以对象化出一个对象。



function Sing()

{

with(arguments.callee)

alert(author + ":" + poem); //实质!

};

Sing.author = "李白";

Sing.poem = "汉家秦地月,流影照明妃。一上玉关道,天涯去不归";

Sing();

Sing.author = "李战";

Sing.poem = "日出汉家天,月落阴山前。女儿琵琶怨,已唱三千年";

Sing();

上面是函数对象化一個对象的实质~

再看!

var anObject = {}; //一个对象

anObject.aProperty = "Property of object"; //对象的一个属性

anObject.aMethod = function(){alert("Method of object")}; //对象的一个方法


var aFunction = function(){}; //一个函数

aFunction.aProperty = "Property of function"; //函数的一个属性

aFunction.aMethod = function(){alert("Method of function")}; //函数的一个方法

两个写法其实是一样的。



那么访问呢? 访问属性的值:



alert(aFunction["aProperty"]); //可以将函数当数组以属性名作为下标来访问属性

aFunction["aMethod"](); //可以将函数当数组以方法名作为下标来调用方法

for( var s in aFunction) //遍历函数的所有属性和方法进行迭代化处理

alert(s + " is a " + typeof(aFunction[s]));

所以在访问js对象的使用 可以使用数组的形式, 使用 属性的名字或者方法的名字 。

object[""]这样

还有遍历对象的属性和方法 for(var s in object){alert(object[s])};

接着说一下,对象的构造:

还有在this这个关键字 ,不一定表示对象本身。

比如:

function WhoAmI() //定义一个函数WhoAmI

{

alert("I'm " + this.name + " of " + typeof(this));

};


var BillGates = {name: "Bill Gates"};

BillGates.WhoAmI = WhoAmI; //将函数WhoAmI 作为BillGates 的方法。

BillGates.WhoAmI(); //此时的this 是BillGates。输出:I'm Bill Gates of object


var SteveJobs = {name: "Steve Jobs"};

BillGates.WhoAmI.call(SteveJobs); //将SteveJobs 作为this,却调用BillGates 的WhoAmI 方法。输出:I'm Steve Jobs of object


看到了吗?SteveJobs并没有,WhoAmI这个方法, 但是通过call 和this的结合 。就可以让stevejobs拥有这个方法

这样对象和对象之间就很灵活了,回想一下, 这样有什么好处了???

关键的问题出现了:

对象和对象之间可以相互的 借势! 没错,就是一個对象有的方法逻辑,写了一篇,要是其他对象也想有这样的方法逻辑,

就可以在这个方法逻辑中使用this 。并且在使用的使用,用call去说 ,要服务哪个 服务的这个对象才是this ,所以

说this 不一定就是指对象本身。准确的说this是指要服务哪个对象。

就是因为上面这样的机制。

javascript中你要构造一個对象的话, 你可以预先构造一個函数, 函数的方法中使用this。

function MyFunc() {}; //定义一个空函数

var anObj = new MyFunc(); //使用new 操作符,借助MyFun 函数,就创建了一个对象,因为函数就是有对象化的作用

其实,可以把上面的代码改写成这种等价形式:

function MyFunc(){};

var anObj = {}; //创建一个对象

MyFunc.call(anObj); //将anObj 对象作为this 指针调用MyFunc 函数

可能有人会奇怪, 为什么要这样写。 不是var anObj={} 就好了吗? 这说明你还没有弄明白我上面所说的。你该回头在看看了。

这样写就是好比模拟java中的类。 对一类有联系的对象先定义好了。

在javascript里这样写,就可以让多个对象,都拥有你定义的function里面的 属性和方法逻辑。

这样写才能模拟出, 像类一样的封装效果。这时候你可以把 function(){}看做一個‘类’。但是别忘了 new它里面的机制就是

函数和对象的超然结合!怎么结合? 就是用两个词: this(服务对象)和call (执行服务)

好了先写到这里, 这一篇我会继续写prototype 这个让 javascript在 共享方法逻辑上 写的更加的优美。。

谢谢
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值