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你会发现在使用对象的时候,根本不需要对 对象的定义。
比如代码:
看到了,当你需要一個对象时, 对象的属性是你直接动态添加的。
这和java c# 一些编程预言就很不一样.
[b]二,javascript 的最神奇的就是 function和object 超然的结合。[/b]
function 可以对象化出一个对象。
上面是函数对象化一個对象的实质~
再看!
两个写法其实是一样的。
那么访问呢? 访问属性的值:
所以在访问js对象的使用 可以使用数组的形式, 使用 属性的名字或者方法的名字 。
object[""]这样
还有遍历对象的属性和方法 for(var s in object){alert(object[s])};
接着说一下,对象的构造:
还有在this这个关键字 ,不一定表示对象本身。
比如:
看到了吗?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在 共享方法逻辑上 写的更加的优美。。
谢谢
在说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在 共享方法逻辑上 写的更加的优美。。
谢谢