﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-一农工作室-文章分类-javascript</title><link>http://www.blogjava.net/ynstudio/category/15261.html</link><description>主要是JavaEE和Ajax</description><language>zh-cn</language><lastBuildDate>Wed, 28 Feb 2007 00:32:34 GMT</lastBuildDate><pubDate>Wed, 28 Feb 2007 00:32:34 GMT</pubDate><ttl>60</ttl><item><title>关于javascript的面向对象</title><link>http://www.blogjava.net/ynstudio/articles/70245.html</link><dc:creator>一农</dc:creator><author>一农</author><pubDate>Mon, 18 Sep 2006 03:43:00 GMT</pubDate><guid>http://www.blogjava.net/ynstudio/articles/70245.html</guid><wfw:comment>http://www.blogjava.net/ynstudio/comments/70245.html</wfw:comment><comments>http://www.blogjava.net/ynstudio/articles/70245.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ynstudio/comments/commentRss/70245.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ynstudio/services/trackbacks/70245.html</trackback:ping><description><![CDATA[
		<div id="show928" class="postcontent">对于javascript的面向对象有不少说法，有的说，javascript不是面向对象的，有的说javascript是基于对象的，有的说使用javascript可以实现面向对象。<br />我
查阅了一些资料，包括ECMAscript Language Specification Edition 3
24-Mar-00，似乎应该说成javascript是基于原型（prototype-based
）的面向对象，而C++，java之类的是基于类的面向对象，即面向对象的实现方式不同。面向对象并不必然是基于class的。一篇文章中提到的面向对象
最主要的三个特性<br />    * Encapsulation（封装） - Support for method calls on a Javascript object as a member of a Class.<br />    * Polymorphism（多态）- The ability for two classes to respond to the same (collection of) methods.<br />    * Inheritance （继承）- The ability to define the behavior of one object in terms of another by sub-classing.<br />在javascript里都可实现。<br />感觉对于理解javascript的面向对象特性，有这样几点需要注意，<br />1、将面向对象作为一个独立的通用概念，面向对象有不同的实现方式，也有不同的扩展。C++的面向对象和java不完全相同，javascript和他们也不完全相同。<br />2、对于java程序员需要知道javascript里的对象和java里所谈的对象（实例）有很大不同。<br />3、函数也是对象，是可以作为构造器的对象，是可以产生对象的对象。因为javascript里所谓对象就是指属性的无序集合。函数可以添加属性，所以也是对象。<br />4、进一步了解new和prototype的定义。<br />5、
再对java程序员说一句，对象，在javascript里非函数的对象，最类似java里的对象（实例），java里对象有属性，有方法，在
javascript里对象只有属性，所谓的方法就是函数类型的属性，引用一般属性可以写成o.x，也可以写成o["x"]，使用对象的方法也同样o.f
()可以，o["f"]()也可以。另外你所引用的对象的属性可以是对象本身的属性，也可以是该对象的构造函数的原型的属性。<br />6、我以前总是对照java来理解javascript，但现在看理解了C++或C的函数指针的概念，将javascript类比C或C++似乎更自然些。<br />具体一点说：<br />对
某函数对象比如Foo执行new操作时，首先会生成一个新对象，一个非函数类型的对象，然后执行Foo，在Foo的函数体中，this代指新创建的函数，
这种操作称为将函数作为构造器（constructor）使用，接着还会将该对象与Foo的原型（Prototype）建立联系。<br />var Foo = function(){<br />   this.x = "abc";<br />   this.sayHello1 = function(){alert("hello你个头！");}<br />};<br />Foo.sayHello2 = function(){alert("你hello个头！");}<br /><br />Foo.prototype.sayHello3 = function(){alert("你个头hello！");}<br /><br />var foo = new Foo;<br />foo.sayHello4 = function(){alert("晕！");};<br />foo.sayHello1();<br />//如果把Foo当作类定义的话，sayHello2可以被理解为静态方法<br />//但和java不同的是，foo.sayHello2();就会抱错。<br />Foo.sayHello2();<br />//在foo的属性里并没有sayHello3这个函数对象，但在foo的构造函数的<br />//原型对象里有这个函数属性，所以可以这么来调用，如果foo的构造函数的<br />//原型对象里也没这个属性的话，就会到这个原型对象的构造函数<br />//的原型对象里去找，以此类推。本例没有体现这一点，今天太晚了，<br />//下一篇里，我会在介绍javascript的几个面向对象的实现方式里写个这样的例子。<br />foo.sayHello3();<br />foo.sayHello4();<br />foo["sayHello4"]();<br />alert(foo.x);
<br /></div>
		<div> </div>
<img src ="http://www.blogjava.net/ynstudio/aggbug/70245.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ynstudio/" target="_blank">一农</a> 2006-09-18 11:43 <a href="http://www.blogjava.net/ynstudio/articles/70245.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>换个角度看javascript--数据类型</title><link>http://www.blogjava.net/ynstudio/articles/70053.html</link><dc:creator>一农</dc:creator><author>一农</author><pubDate>Sat, 16 Sep 2006 09:03:00 GMT</pubDate><guid>http://www.blogjava.net/ynstudio/articles/70053.html</guid><wfw:comment>http://www.blogjava.net/ynstudio/comments/70053.html</wfw:comment><comments>http://www.blogjava.net/ynstudio/articles/70053.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ynstudio/comments/commentRss/70053.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ynstudio/services/trackbacks/70053.html</trackback:ping><description><![CDATA[之所以说换个角度是指我现在对javascript的理解与我以往对javascript的理解。在这种理解的转变中最大的转变是对函数的理解，以及随之而来的对javascript的对象，尤其是对象属性的理解上的变化。简单的说，现在理解的函数，不是和变量类型同级的概念，而是变量类型的一种，即函数也是一个对象，一个可以象数字，字符串一样赋值给一个变量的实体。这个和C里将指针指向函数有些类似，但我一直都是把javascript类比java来理解。<br /><br /><strong>首先对javascript的类型再熟悉一遍</strong><br /><br />javascript中变量(variable)的值(value)有这样几种类型(type)：<br />(ECMAscript Language Specification Edition 3 24-Mar-00)<br /><span style="FONT-WEIGHT: bold">8.1 The Undefined Type</span><br />The <br />Undefined type has exactly one value, called undefined. Any variable <br />that has not been assigned a value has the value undefined.<br /><span style="FONT-WEIGHT: bold">8.2 The Null Type</span><br />The Null type has exactly one value, called null.<br /><span style="FONT-WEIGHT: bold">8.3 The Boolean Type</span><br />The Boolean type represents a logical entity having two values, called true and false.<br /><span style="FONT-WEIGHT: bold">8.4 The String Type</span><br />The String type is the set of all finite ordered sequences of zero or more 16-bit unsigned integer values<br />(“elements”).<br /><span style="FONT-WEIGHT: bold">8.5 The Number Type</span><br />The Number type has exactly 18437736874454810627 (that is, 264−253+3) values, representing the doubleprecision<br />64-bit format IEEE 754 values as specified in the IEEE Standard for Binary Floating-Point Arithmetic,<br />except that the 9007199254740990 (that is, 253−2) distinct “Not-a-Number” values of the IEEE Standard are<br />represented in ECMAscript as a single special NaN value. (Note that the NaN value is produced by the program<br />expression NaN, assuming that the globally defined variable NaN has not been altered by program execution.)<br /><span style="FONT-WEIGHT: bold">8.6 The Object Type</span><br />An Object is an unordered collection of properties. Each property consists of a name, a value and a set of attributes.<br /><br />我们比较关注面向对象，所以对其中的Object类型多加留意。<br />如上面的定义，Object类型是无序的属性的集合。每个属性(property)有名称，值和一些性质(attributes)（如只读，可枚举，不可删，内部的）。<br /><br />举几个例子：<br />var a;//a现在对应一个值，该值的类型是<span style="FONT-WEIGHT: bold">Undefined<br />a = 1;//现在a对应一个Number类型的值<br />a = true;//现在a的类型变了，变成一个Boolean类型的值。<br />a = "x";//a现在对应一个String类型的值<br />//</span><span style="FONT-WEIGHT: bold">（注意"x"和new String("x")并不相同）<br />//</span><span style="FONT-WEIGHT: bold">说到这里想到javascript里两个相等操作符==和===<br />//==只针对基本的数据类型，不对Object，如果待比较的两个值都是Object的话<br />//返回false，除非是同一个对象，如果有有一个是Object的话，将之转化为和另外一个值相同类型的值<br />//然后进行比较。===则要求两者类型也相同。<br />var b = new String("x");<br />alert(a == b);//true<br />alert(a===b);//false 因为类型不同<br /></span><span style="FONT-WEIGHT: bold">alert(typeof a);//string<br /></span><span style="FONT-WEIGHT: bold">alert(typeof b);//object<br /></span><span style="FONT-WEIGHT: bold">a = {};<br />//查看类型的方法是typeof，可以写成typeof a也可以写成typeof(a)<br />//参看typeof的说明<br />alert(typeof a);//object<br />alert(typeof true);//boolean<br />alert(typeof(typeof true))//string<br /><br /></span><span style="FONT-WEIGHT: bold" dragover="true">typeof的执行逻辑</span><br /><br /><table style="WIDTH: 428px; HEIGHT: 202px" cellspacing="0" cellpadding="0" border="2" dragover="true"><tbody><tr><td dragover="true">Undefined</td><td dragover="true">"undefined"</td></tr><tr><td dragover="true">Null <br /></td><td dragover="true">"object"</td></tr><tr><td dragover="true">Boolean</td><td dragover="true">"boolean"</td></tr><tr><td dragover="true">Number</td><td dragover="true">"number"</td></tr><tr><td dragover="true">String</td><td dragover="true">"string"</td></tr><tr><td dragover="true">Object (native and doesn’t implement [[Call]])</td><td dragover="true">"object"</td></tr><tr><td dragover="true">Object (native and implements [[Call]])</td><td dragover="true">"function"</td></tr><tr><td style="VERTICAL-ALIGN: top">Object (host)<br /></td><td style="VERTICAL-ALIGN: top">Implementation-dependent<br /></td></tr></tbody></table><br /><span style="FONT-WEIGHT: bold" dragover="true">从上面可以看到对于Object类型，typeof根据值的情况返回object或function。<br />（注：所谓</span>implement [[Call]]我的理解就是指是否可以作为函数调用<span style="FONT-WEIGHT: bold" dragover="true">，native有两种一种是内置的如Array，Date等另一种是用户自己定义的。除此之外就是host即javascript的宿主提供的一些对象。）<br /></span><img src ="http://www.blogjava.net/ynstudio/aggbug/70053.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ynstudio/" target="_blank">一农</a> 2006-09-16 17:03 <a href="http://www.blogjava.net/ynstudio/articles/70053.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>