??xml version="1.0" encoding="utf-8" standalone="yes"?>
朋友l了个blog,专门放ajax的文章吧Q以后这专门写关于java的东西吧?br />http://zkj.wisekernel.net
谢谢支持?img src ="http://www.tkk7.com/zkjbeyond/aggbug/64760.html" width = "1" height = "1" />
]]>
阅读全文
]]>
如果你懂javascriptQ而你不了解javascript的闭包?
那你错qjavascript最强大Ҏ(gu)之一Q闭包)?nbsp; 阅读全文
]]>
groove,python,perlq些高脚本语言都有闭包概念。不懂这些语a的可能没Z(x)理解闭包了?
q运的是大家都熟(zhn)javascript,那么从javascript开始闭包认识吧?
感觉闭包是高U的Q但也是晦ӆ的?
本文译自
http://jibbering.com/faq/faq_notes/closures.html
阅读全文
]]>
{。一般书上都叫对象层ơ和文档对象模型。用dom标准来说Q一般浏览器都实?/p>
?UDOMQ关于DOM标准我感觉知?U就可以了。对于DOM标准W3C早已定义?U?/p>
Q?U,三也在标准化,问题是各个浏览器不完全实玎ͼ其是IE的事件模型,
完全不和DOM一致。(不过prototype.js已经做了很好的封装)
我这里不?x)讲dom接口Q更不会(x)讲各个浏览器的如何实现这些接口及(qing)区别。(
我也没这能力Q。而是要猜一下浏览器是怎么用javascript定义q些接口或类
的。(注意是猜,个h理解Q?/p>
2、引?/strong>
<SCRIPT LANGUAGE="JavaScript">
<!--
alert(document);
alert(typeof(document));
//alert(Document);//出错
function desc(obj){
var ret='';
for(var key in obj){
ret+=key+':'+obj[key]+'</br>';
}
return ret;
}
document.writeln(desc(document));
//-->
</SCRIPT>
以上单的javascript代码Q不知大家提疑问没有?br />首先Qdocument是个javascript对象Q谁创徏了它。;document的类是什?/p>
(function Document(){....} 可能是new Document()创徏了它)Qdocument有些
什么属性或Ҏ(gu)。这些对象与html关系是什么。这些对象与dom标准有什么关pR?/p>
接下来将试着回答q些问题。我?x)侧重讲q我的理解思\Q而不是具体哪个方?/p>
Q接口?/p>
3、一个简单的例子的深入理?/strong>
<SCRIPT LANGUAGE="JavaScript">
<!--
alert(document);//存在
alert(this.document==window.document);//true
//-->
</SCRIPT>
<HTML>
<HEAD>
<TITLE> New Document </TITLE>
<SCRIPT LANGUAGE="JavaScript">
alert(document.getElementById('xm'));//null
</SCRIPT>
</HEAD>
<SCRIPT LANGUAGE="JavaScript">
alert(document.getElementById('xm'));//null
</SCRIPT>
<BODY>
<SCRIPT LANGUAGE="JavaScript">
alert(document.getElementById('xm'));//null
</SCRIPT>
<input type="text" id="xm">
<SCRIPT LANGUAGE="JavaScript">
alert(document.getElementById('xm'));//存在
</SCRIPT>
</BODY>
<SCRIPT LANGUAGE="JavaScript">
alert(document.getElementById('xm'));//存在
</SCRIPT>
</HTML>
上面代码说明几个问题Q?br />a?/strong>window\this是我在变量里面提到过的窗体的全局对象Qdocument是它?/p>
一个属性,也叫全局属性?br />b?/strong>window,document在html最前面已经存在了。我们可以随处用document对象 ?br />c?/strong>对于输入框按钮这chtml标记的javascript对象只有在解释过以后才能讉K?/p>
。当然我们编码用到这些对象时Q都在body.onload或鼠标触发,一般不?x)出错?br />d?/strong>例子中的document.getElementById('xm')javascript对象和我们自己创建的 javascript对象有什么区别呢Q从应用角度看没有区别,只是自己定义的对象由 自己new来初始化Q而document.getElementById('xm')有浏览器为我们初始化?/p>
象,我们直接用方法得到句柄就可以了(有多U方法)?br />e?/strong>我们怎么知道q些对象的用法呢Q查看w3c DOM参考吗Q我认ؓ(f)不用?/p>
4、浏览器为我们创建的对象与我们自己定义的对象的区别?/strong>
<input type="text" id="xm" value="aaa">
(document.getElementById('xm').value); 希望你仔l的看看上面代码的执行结果。可能你?x)得到更震撼的想法来。暂时我 有以下几个感惻I(x) 器的内徏cR?br />b?/strong>反过来,对于览器ؓ(f)我们创徏的对象,我们可以当成自己的对象一样用?/p>
看看prototype.js中,使用了内建对象的Ҏ(gu)?/p>
escapeHTML: function() { outerHTML属性的值是什?在网上表示什么。可以看出javascript对象?/p>
outerHTML属性就是html(xhtml)规范中的标签。这L(fng)了我们写javascriptUI?/p>
件的新思\Q一个控件就是一个javascript对象Q其实很多h都这样做了,但好 象都是innerHtml{等Q。可以象asp.net或jsf那样~写l合控g?br />大家可以看一下ActiveWidgets代码Q与我的思\有些差别Q,我认U基?/p>
html标签的UI控g无论性能、开发h员用难度上都不错? html的UI标签。性能不好Q开发h员上手不Ҏ(gu)Q美工更不能修改Q另外图片都 是定ȝQ界面也比较单调Q也不好修改?/p>
对于自己实现javascript控gQ我认ؓ(f)在htmlUI基础上就可以了,毕竟自己实现 存在的UI隑ֺ不小。把html的标准UIl合成新的控件。例如,我们可以很容易的 实现一个包括?Q登?密码 验证?认Q?的组合javascript控g
input type="text">的所有属性。这些属?”dom标准“,之所以加引号QDOM?/p>
准我们有很多误解Q认为DOM标准是个什么高不可?qing)、不可违抗的、复杂的东西?br />首先Q我们接触了静态HTML,xmlQ有了DOM对象模型Q熟(zhn)java的都知道java的实 玎ͼQ但javascript语言的特点不能象java,c++那样来实现DOM对象模型。例? input l承?HTMLElementQHTMLElement定义的一堆属性。按照dom标准,所有浏 览器实现 input javascript对象旉必须把这些属性加上,q就叫符合标准。其 实说白了QDOM标准是览器ؓ(f)我们实现的javascript代码的d。(可以览 器厂商不完全实现Q?br />看protorype.js的代?br />Z支持多了览器,定义下面代码。说明有的浏览器|页全局变量里有Element QEventQ有些浏览器没给我们定义。所以只能这样了?/p>
if (!window.Element) { q有用AJAX技术时 单,是览器中有没有这些javascript实现了。所有大家在DWR框架中用iframe 实现了一个javascript XMLHTTPcR?/p>
e?/strong>与xhtml标准的矛?br />在xhtml中,<input type="button"> 双引h必须的,但outerHTML属性中却没 双引受还没想明白?/p>
5、浏览器为我们创Z几类对象
Math,setTimeout()Q都可以由window对象讉K。另外浏览器的特D函数或属性?/p>
Q如window.status,window.alert()Q?br />b、document对象。包括图片,applet,form{属性,可能我们用的最多。也是访 问我们可见的元素的入口(document.getElementByIdQ?也提供了动态创建html 标签的方法。如var t=new Text("test");没有q样Ҏ(gu)Q只?var t=document.creatTextNode("test");都由document提供的工厂方法来创徏?br />c、页面中的html标签Q当解释执行q,览器会(x)Z初始化对象,攑ֈdocument 对象中去?/p>
6、对DOM标准的认?/strong>
的类我们也看不见。所以这里接口的含义和java中接口的含义不同?br />例如我们常用的document对象 document对象有哪些属性和Ҏ(gu)是有览器决定的Q而不是由DOM标准军_的?br />在这里javascript世界里没有承概念,所以DOM标准定义的接口,对于我们开?/p>
人员来说只能当成一个参考手册,象javadoc?/p>
7、如何写览器的javascript代码
的代码补全就好了。但DOM标准之大不是一般h能全部搞清楚的,览器厂商也?/p>
坏,让这个工作更难了。 ?现在好象有个误区Qh们写javascript都喜Ƣ按?/p>
DOM标准来写。如果我们按照各个浏览器实现DOM标准的交集写代码的话Q可能会(x) 更好炏V?/p>
我把q类型的l承叫做cȝ承,直接把你自己写的对象属性拷贝到原型对象中去?/p> 看了以上代码Q可能你?x)明白。直接拷贝类的原型对象确实可以实现某U概念上的ѝ?br />但要注意Q在l承体系中,Man的原型对象属性方法最好不要用Man的实例属性(nameQ,因ؓ(f)可能Woman中ƈ没有定义实例属性name;也最好不要用Man)原型对象属性字D(typeQ?虽然type也被拯q来了,但D是”男人“?br />虽然有解军_法,但javascript没有很好的语法检查工P你用prototype.js的类l承时小心处理?/p> b、prototype.js中的对象l承 prototype.js 1.3.1 q个应用比较单,典型的对象之间属性拷贝覆盖?br />ȝQ关于prototype.js中承的实现Q我们当成javascript对象的属性拷贝可能在应用中更好理解。徏议大家仔l读读prototype.js代码可能体会(x)更深。模仿prototype.js中extend的应用。感觉var Insertion = new Object(); 的实现比较经典?/p> Q?Q、dojo-0.2.0-ajax中的l承 dojo的承实现比较正l,也是《javascript权威指南》中的实现方法。注意最后一句代码可以实现子c访问父cd型对象的Ҏ(gu)?br /> 看看代码Q感觉乱?br />dojo一直没旉仔细读读代码。这部分详细讨论待箋?br />(3)、ȝ (1)对象属性优先 (2)prototype属性是只读?/strong> 我理解functionq回的数据类型是和Object同等U的数据cd。它有Object实例Qnew Object()Q的一些特?但它不是Object的实例,因ؓ(f)它没有承Object.prototype.toString=function(){return 'myToString'};但我们Person.toString=function(){return 'Person toString'};改变了覆盖了Ҏ(gu)?br />在《javascript权威指南》中Q作者用q个Ҏ(gu)实C“类Ҏ(gu)、类变量”staticҎ(gu)Q与java中不同,q些Ҏ(gu)不能用new Person()来调用?/p> Object function 同等U?function可以定义属性,可以(for in) new Object() new function() 同等U?new function()l承了Object的prototype, 也会(x)l承 function的prototype 例子。看了原型对象就很清楚了啊?原型对象最好在代码最前面定义Q很Ҏ(gu)被覆盖啊Q?br /> 用typeof() Ҏ(gu)q回的是 object 的变量都是对象?Function除外用new定义的不一定都是对象。? 的一些属性?/p>
1、constructor属?br />从javascript1.1开始,每个对象都有q个属性,它指向用来初始化改对象的构?/p>
函数 如以上代码,可以知道 ?br />c、用原型对象实现的承中Q也要设|子cȝconstructor。如果你的程序中?/p>
CconstructorQ可能会(x)出错?br />2、toString()Ҏ(gu) 法?var s='1'+'2',?x)自动?1' '2' 转化成String对象在执行?/p>
但数l定义自qtoStringҎ(gu)。alert(Array.prototype.toString) 如果对象或子c要调用父类的方法可?/p>
3、toLocalString()Ҏ(gu)
什么用法?br />4、valueof()
5、hasOwnProperty()Ҏ(gu)
验对象的实例属性。对原型属性不?x)返回?/p>
举,但返回false
true. 看代码吧?br />居然alert(Object.prototype.isPrototypeOf(Person));//true也是true.搞不?br />
8、ȝ Q但让我更加混ؕQ《javascript权威指南》讲的也有错误。开发中大家?/p>
了toString,其他属性方法不要覆盖也不要使用了。除了对q些Ҏ(gu)十分清楚。就 我知道的javascript开源框架中好象没用到这些?br /> a、function add(x,y){return x+y;} 在这Q如果用add(2,3);调用Q返回的l果都是5。但它们使用有很大的区别Q后面在详细解释?br /> 看例子,基本你可以把arguments当成个数l用,但ƈ不是真正的数l?br /> 虽然arguments.length and arguments[index]可以在函数内改变Q但你不要在函数内改变它们。关于arguments的具体用法可以看prototype.js.
3、函数是一U数据类?/strong>
其实javascript的熟手不?x)在全局变量里(直接在js文g中)定义函数Q都?x)定义在全局变量的属性字D中。如 如果q种写法Q我们就基本不会(x)和别人写的程序发生命名上的冲H了?/p>
4、函数的生命周期
首先Q预~译代码Q把s、fun讄为golbe的属性,q赋值s=undefined,fun=函数定义Q可以直接调用)?br />然后Q按照顺序解释执行代码。赋值s="golbe"; 函数已经可以直接调用了?br />执行函数Q当q行到fun("test")Ӟ开始函数调用?br /> 先ؓ(f)本次调用建立一个调用对象(fun-globalQ?br /> 预编译函C内代码,把参数设|ؓ(f)fun-global的属性,gؓ(f)Z入?test",查找varQ把a讄成fun-global的属性,gؓ(f)undefined.(如果var s与参数名U相同,则不重复讄例如函数体内var s="local";)
调用对象是个暂时对象Q生命周期很短,只有在调用过E中存在Q递归可能?x)徏立多个独立的调用对象?
5、函数的属性和Ҏ(gu)
b、prototype
<SCRIPT LANGUAGE="JavaScript"> 改一下代码,得到 000 undefined 111 111 q个文章主要讲变量的一些问题。变量说了,Z么函数可以,我变量就不可以呢?br /><SCRIPT LANGUAGE="JavaScript">
<SCRIPT LANGUAGE="JavaScript"> 关于函数与变量javascript预编译的不同处理Q大家可以与java class的加载过E比较下。java也是对基本类型设出|对象为null的。(不往q扯了)
<INPUT TYPE="button" value='click me' onclick="alert
alert(document.getElementById('myxm').value);">
<br>
<SCRIPT LANGUAGE="JavaScript">
<!--
function desc(obj){
var ret='';
for(var key in obj){
ret+=key+':'+obj[key]+'</br>';
}
return ret;
}
function MyText(id,value){
this.id=id;
this.outHtml='<input type=text id='+id+' value='+value+'>';
this.toString=function(){
return this.outHtml;
}
//...
//...
//...
}
//document.writeln(desc(document.getElementById('xm')));
var myText=new MyText('myxm','zkj');
document.writeln(myText);
//-->
</SCRIPT>
a?/strong>我们自己也可以写一个界面控Ӟ如果把属性徏立全的话Q完全可以复原浏?/p>
var div = document.createElement('div');
var text = document.createTextNode(this);
div.appendChild(text);
return div.innerHTML;
},
unescapeHTML: function() {
var div = document.createElement('div');
div.innerHTML = this.stripTags();
return div.childNodes[0] ? div.childNodes[0].nodeValue : '';
},
c?/strong>大家可以打开描述注释Q看?lt;input >到底包含哪些属性和Ҏ(gu)。注?/p>
对于dojo的widgetq种做UI做法我个Z很赞同,完全用divQ图片实C一?/p>
d?/strong>dom标准与浏览器对象
打开document.writeln(desc(document.getElementById('xm')));Q你可以看到<
var Element = new Object();
}
if (!window.Event) {
var Event = new Object();
}
'Msxml2.XMLHTTP', 'Microsoft.XMLHTTP', 'Msxml2.XMLHTTP.4.0'Q?其实很简
a、全局对象window或this。其实javascript的全局变量、全局Ҏ(gu)Q如
DOM标准定义了接口,没有定义cR浏览器为我们实Cq些接口Q实现这些接?/p>
DOM标准中定义了个Document接口Q实现HTMLElemnt接口?br />Document接口和HTMLElemnt接口在DOM标准中定义了很多属性和Ҏ(gu)?br />注意我们使用的document对象是浏览器为我们创建的javascript对象Q到?/p>
q难度大了点.但说I了Q只要我们用javascript代码把浏览器没符合DOM标准
]]>
<
SCRIPT LANGUAGE
=
"
JavaScript
"
>
<!--
Object.extend
=
function (destination, source)
{
for
(property in source)
{
destination[property]
=
source[property];
}
return
destination;
}
function Man()
{
this
.name
=
'
zkj
'
;
}
Man.prototype.type
=
'
男h
'
;
Man.prototype.getType
=
function ()
{
return
this
.type;
}
function Woman()
{}
Object.extend(Woman.prototype,Man.prototype);
var man
=
new
Man();
var woman
=
new
Woman();
alert(man.getType());
alert(man.name);
alert(woman.getType());
alert(woman.name);
//
-->
</
SCRIPT
>
我只能说javascript的承是模拟实现的。和java,c++中是不同的。是依靠prototype实现的?br />我个Z来不用javascript的“扎쀝,始终认ؓ(f)javascript实现的承不是真正的l承。可能是受java”毒害“够深?br />在javascript中,我把l承分ؓ(f)两类Q?cȝ承,对象l承?br />Q?Q、prototype.js中的l承
prototype.js中用如下代码实现l承。我认ؓ(f)只是个属性拷贝过E?br />Object.extend = function (destination, source)
{
for (property in source)
{
destination[property] = source[property];
}
return destination;
}
//Object.prototype.extend 感觉q句话没必要Q太模仿java了,惌对象实例直接l承?br /> a、prototype.js中的cȝ?br />prototype.js 1.3 . 1
String.prototype.extend(
{
stripTags: function ()
{
return this .replace( /< \ /? [ ^> ] +>/ gi, '');
} ,
escapeHTML: function ()
{
var div = document.createElement('div');
var text = document.createTextNode( this );
div.appendChild(text);
return div.innerHTML;
} ,
unescapeHTML: function ()
{
var div = document.createElement('div');
div.innerHTML = this .stripTags();
return div.childNodes[ 0 ].nodeValue;
}
} );
<SCRIPT LANGUAGE = "JavaScript">
<!--
Object.extend = function (destination, source)
{
for (property in source)
{
destination[property] = source[property];
}
return destination;
}
function Man()
{
this .name = 'zkj';
}
Man.prototype.type = '男h';
Man.prototype.getType = function ()
{
return this .type;
}
function Woman()
{}
Object.extend(Woman.prototype,Man.prototype);
var man = new Man();
var woman = new Woman();
alert(man.getType());
alert(man.name);
alert(woman.getType());
alert(woman.name);
// -->
</SCRIPT>
this.options = {
method: 'post',
asynchronous: true,
parameters: ''
}.extend(options || {});dojo.inherits = function (subclass, superclass)
{
if ( typeof superclass != ' function ')
{
dojo.raise( " superclass: " + superclass + " borken " );
}
subclass.prototype = new superclass();
subclass.prototype.constructor = subclass;
subclass.superclass = superclass.prototype;
// DEPRICATED: super is a reserved word, use 'superclass'
subclass['super'] = superclass.prototype;
}
<SCRIPT LANGUAGE = "JavaScript">
<!--
function Man()
{
this .name = 'zkj';
}
Man.prototype.type = '男h';
Man.prototype.getType = function ()
{
return this .type;
}
function Woman()
{}
Woman.prototype = new Man();
Woman.prototype.constructor = Woman;
Woman.superclass = Man.prototype;
// DEPRICATED: super is a reserved word, use 'superclass'
Woman['super'] = Man.prototype;
Woman.prototype.type = '女h';
var man = new Man();
var woman = new Woman();
alert(man.getType());
alert(man.name);
alert(woman.getType());
alert(Woman.superclass.getType());
alert(woman.name);
// -->
</SCRIPT>
关于javascript的承实玎ͼ一般不要用,感觉很ؕQ代码可L较差。一般也没有使用必要。详l在?、javascript对象使用指南》中讨论?br />
]]>
通过q行以下代码Q我们访问对象属性优先如下Qc>b>d>e
cU属性必d定义以后讉K才有效。aU属性实例访问不到?br />javascrpt语言预定义的属性不能用for in 得到。如toString<SCRIPT LANGUAGE = "JavaScript">
<!--
Object.prototype.toString = function ()
{} ;
Object.prototype.name = " Object " ;
Object.prototype.porotype_name = " oObject " ;
Object.prototype.parent_name = " pObject " ;
Person.prototype.name = " Person " ;
Person.prototype.porotype_name = " oPerson " ;
function Person()
{
this .name = 'Person实例';
}
var o = new Person();
for ( var key in o)
{
alert(key + ':' + o[key]);
}
// -->
</ SCRIPT >
看如下代码,你不要试N过变量改变原型对象的属性。你也不可能改变Q你只会(x)通过c模式l对象增加一个属性?br />另外原型对象是所有实例共享的。理Z也不可以改变?/p><SCRIPT LANGUAGE ="JavaScript">
<!--
Person.prototype.name = " Person " ;
function Person()
{
}
var o = new Person();
var o1 = new Person();
alert('o.name:' + o.name + ' ' + 'o1.name:' + o1.name);
o.name = 'zkj';
alert('o.name:' + o.name + ' ' + 'o1.name:' + o1.name);
// -->
</SCRIPT>
]]><SCRIPT LANGUAGE = "JavaScript">
<!--
Person.type = " person " ;
Person.writeType = function ()
{
document.writeln( this .type);
}
// var Person = function(){}//如果q样定义?x)报?可以看看前面文章Q函数的预编译。?/span>
function Person()
{}
Person.writeType();
alert( typeof (Person));
for ( var key in Person)
{
alert(key);
}
var person = new Person();
// -->
</SCRIPT>
见如下代码:(x)<SCRIPT LANGUAGE = "JavaScript">
<!--
Object.prototype.toString = function ()
{ return 'myToString'} ;
function Person()
{
}
Person.prototype.toString = function ()
{ return 'Person'} ;
var o = new Person();
alert(o);
alert(Person)
Person.toString = function ()
{ return 'Person toString'} ;
alert(Person)
// -->
</SCRIPT>
<SCRIPT LANGUAGE = "JavaScript">
<!--
var Person = function ()
{
this .name = 'Person的构造函C属性name';
this .getName = function ()
{
return this .name;
}
// this.toString=function(){} //你把注释L看看效果
}
Person.name = " Person " ;
Person.toString = function ()
{ return this .name + '的类Ҏ(gu)'} ; // 我可以用this啊?/span>
alert(Person.toString()) // cL法?/span>
var o = new Person();
alert(o.getName()); // 构造函C的方法?/span>
alert(o); // 讉KtoStringҎ(gu) 先找 对象中 构造函C Person的prototype中 Object的prototype中?/span>
Object.prototype.toString = function ()
{ return 'Object的prototype中的toString'} ;
alert(o); // Object的prototype中?/span>
Person.prototype.toString = function ()
{ return 'Person的prototpe中的toString'} ;
alert(o);
o.toString = function ()
{ return '我覆盖了toStringҎ(gu)了啊'}
alert(o);
alert('我不能访问前面的toString了。如果有super好了!');
// 其实q是可以讉K到被覆盖的原型的。那样太复杂了。?/span>
// -->
</SCRIPT>
]]>
<
SCRIPT LANGUAGE
=
"
JavaScript
"
>
<!--
Object.prototype.toString
=
function ()
{
return
'
myToString
'
}
;
var o
=
new
Object();
o.name
=
'
zkj
'
;
o.age
=
25
;
o.desc
=
function ()
{
return
'
姓名Q?/span>
'
+
this
.name
+
'
,q龄:
'
+
this
.age}
;
for
( var key in o)
{
alert(key
+
'
:
'
+
o[key]
+
'
type:
'
+
typeof (o[key]))
if
( typeof (o[key])
==
'
function
'
)
{
alert(
'
执行Ҏ(gu)keyQ?/span>
'
+
(o[key])())
}
}
alert(o);
alert(
new
Date());
//
-->
</
SCRIPT
>
<
SCRIPT LANGUAGE
=
"
JavaScript
"
>
<!--
Object.prototype.toString
=
function ()
{
return
'
myToString
'
}
;
function person()
{
}
var o
=
new
person();
o.name
=
'
zkj
'
;
o.age
=
25
;
o.desc
=
function ()
{
return
'
姓名Q?/span>
'
+
this
.name
+
'
,q龄:
'
+
this
.age}
;
for
( var key in o)
{
alert(key
+
'
:
'
+
o[key]
+
'
type:
'
+
typeof (o[key]))
if
( typeof (o[key])
==
'
function
'
)
{
alert(
'
执行Ҏ(gu)keyQ?/span>
'
+
(o[key])())
}
}
alert(o);
alert(
new
Date());
//
-->
</
SCRIPT
>
看以上两D代码,估计很多人对后面的代码熟(zhn),也这样写了。可他们执行l果是一L(fng)。如果你改变了javascript对象的原型对象后?x)有些区别?br />在这我想提出以下几个问题Q?br /> a、javascript对象也是单根l承的对?但不是所有对象都l承自Object.如例子中的Date对象?br /> b、千万别乱定义Object.prototype原型对象。prototype.js中加了个extends被h说了半天。但我们自己写类库时Q千万别试改Object的prototype?br /> c、别用javacript语言模仿java来写代码。想上面的,需要一个person的“类”,q不是非需要定义一个,注意javascript对象的属性是可以随意增加或删除的。ƈ不象java那样在类中写歅R?br /> d、就上面两段代码有什么区别呢Q可以简单的说是personl承了Object”类“。javascript中对象的l承是用prototype来实现的Q后面我们讨论prototype原型对象?br /> e、那我们应用的时候到底是否该自己定义自己的构造函敎ͼ如personQ?q是直接使用Object呢?q是个复杂的问题Q我个h来说喜欢多用Object.
]]>
d、用自定义的构造函数创建的对象。function O(){}; var o=new O();
e、dom模型定义的构造函敎ͼ览器ؓ(f)你创建的对象。用var o=document.getElementById();或其他方法获得?br /> f、null也是对象。typeof(null)= object.undefined我理解ؓ(f)变量预编译的初始化|而null是特D的对象。如果一个变?null,说明q个变量是个对象Q但不是我上面提到的M来源方式的对象?如document.getElementById(面中不存在的id);可以产生一个null对象?
]]>
<
SCRIPT LANGUAGE
=
"
JavaScript
"
>
<!--
function
Person()
{}
var
o
=
new
Person();
alert(
typeof
(Person.constructor));
alert(o.constructor);
alert(Person.constructor);
alert(Function.constructor);
alert(Object.constructor)
alert(
new
Date().constructor);
alert(Date.constructor);
function
Man()
{
}
Man.prototype
=
new
Person();
alert(Man.constructor);
o
=
new
Man();
alert(o.constructor)
Man.prototype.constructor
=
Man;
alert(o.constructor)
//
-->
</
SCRIPT
>
a、constructor的类型是函数Q?br />b、javascript内部实现了很多函敎ͼ如Object,Date都是函数由Function得到?/p>
相当于java ObjectcMtoStringҎ(gu)。你alert() + {操作中׃(x)调用q个?/p>
<
SCRIPT LANGUAGE
=
"
JavaScript
"
>
<!--
alert([
1
,
2
,
3
].toLocalString())
alert(Object.prototype.toString.apply([
1
,
2
,
3
]));
//
-->
</
SCRIPT
>
ECMAScript v3 javascript1.5中定义了q个Ҏ(gu)。返回局部化的倹{偶q不知道
当javascript与要一个对象{化成字符串之外的原始cd时调用它?/p>
《javascript权威指南》说如果是非l承的属性返回true.但下列代码反映,它检
<
SCRIPT LANGUAGE
=
"
JavaScript
"
>
<!--
function
Person(name)
{
this
.name
=
name;
}
Person.prototype.setAge
=
function
(age)
{
this
.age
=
age;
}
Person.prototype.toString
=
function
()
{
return
'name:'
+
this
.name
+
' age:'
+
this
.age;
}
var
o
=
new
Person('zkj');
o.setAge(
25
);
alert(o)
alert(o.hasOwnProperty(
"
name
"
));
alert(o.hasOwnProperty(
"
age
"
));
alert(o.hasOwnProperty(
"
setAge
"
));
alert(o.hasOwnProperty(
"
toString
"
));
alert(Person.prototype.hasOwnProperty(
"
setAge
"
));
//
-->
</
SCRIPT
>
6、propertyIsEnumerable
《javascript权威指南》如果用?for( in )枚D的属性,q个Ҏ(gu)q回true;
以下代码说明《javascript权威指南?font color="#ff3300">是错?/font>。自己定义的原型对象属性可以枚
<
SCRIPT LANGUAGE
=
"
JavaScript
"
>
<!--
function
Person(name)
{
this
.name
=
name;
}
Person.prototype.setAge
=
function
(age)
{
this
.age
=
age;
}
Person.prototype.toString
=
function
()
{
return
'name:'
+
this
.name
+
' age:'
+
this
.age;
}
var
o
=
new
Person('zkj');
o.setAge(
25
);
alert(o.propertyIsEnumerable('setAge'));
var
desc
=
'';
for
(
var
key
in
o)
{
desc
+=
key
+
' ';
if
(o.hasOwnProperty(key))
{
desc
+=
' 是实例对象?;
}
else
{
desc
+=
' 不是实例对象 ';
}
if
(o.propertyIsEnumerable(key))
{
desc
+=
' 能被枚D ';
}
else
{
desc
+=
' 不能被枚举?;
}
desc
+=
'\r\n';
}
alert(desc);
//
-->
</
SCRIPT
>
7、isPrototypeOfҎ(gu)
《javascript权威指南》如果调用对象是实际参数指定的对象的原型对象q回
<
SCRIPT LANGUAGE
=
"
JavaScript
"
>
<!--
function
Person(name)
{
this
.name
=
name;
}
Person.prototype.setAge
=
function
(age)
{
this
.age
=
age;
}
Person.prototype.toString
=
function
()
{
return
'name:'
+
this
.name
+
' age:'
+
this
.age;
}
var
o
=
new
Person('zkj');
o.setAge(
25
);
alert(Person.prototype.isPrototypeOf(o));
//
true
alert(Person.isPrototypeOf(o));
//
false
alert(o.isPrototypeOf(Person.prototype));
//
false
alert(Function.prototype.isPrototypeOf(Person));
//
true
alert(Object.prototype.isPrototypeOf(Person));
//
true
//
-->
</
SCRIPT
>
看《javascript权威指南》前Q就知道toStringҎ(gu)。现在知道了些其他的Ҏ(gu)
]]>
javascript中提供了许多预定义函敎ͼ我们可以直接使用Q比如Math.sin();eval(){?br />我们也可以定义自q函数。有以下四种Ҏ(gu)Q?/p>
b、var add = function(x,y){return x+y;}
c、var add = new Function("x","y","return x+y;");
d、var add =function a(x,y){return x+y;}
2、函数的参数
回想上一提到函数的调用对象。虽然我们不能访问它Q看不见Q但引入q个概念实可以方便我们解释很多东西?br /> 在一个函C内,标识Warguments有特D含义。它是调用对象的一个特D属性?br />
<
SCRIPT LANGUAGE
=
"
JavaScript
"
>
function
add(x,y)
{
document.writeln('x
=
'
+
x);
document.writeln('y
=
'
+
y);
document.writeln('arguments[
0
]
=
'
+
arguments[
0
]);
document.writeln('arguments[
1
]
=
'
+
arguments[
1
]);
arguments[
0
]
=
11
;
document.writeln('arguments[
0
]
=
'
+
arguments[
0
]);
return
x
+
y;
}
document.writeln(add(
2
,
3
));
</
SCRIPT
>
argumentsq有个属?callee.引用当前正在执行的函数?/p>
<
SCRIPT LANGUAGE
=
"
JavaScript
"
>
function
add(x,y)
{
document.writeln(arguments.callee);
document.writeln(
typeof
(arguments.callee));
return
x
+
y;
}
document.writeln(add);
document.writeln(
typeof
(add));
document.writeln('
</
br
>-----------------------</
br
>
');
add();
</
SCRIPT
>
在javascript中,函数不但能象java一样当成语a的语法特性,q可以象字符丌Ӏ数字、日期一样当成一U数据?br /> var add=function(x,y){return x+y;};其实我们函数的定义都是把函数附值给变量。函C但可以附值给变量Q还可以当成参数传递?/p>
<
SCRIPT LANGUAGE
=
"
JavaScript
"
>
var
add
=
function
(x,y)
{
return
x
+
y;}
;
var
fun
=
add;
function
opetate(fun,x,y)
{
return
fun(x,y);
}
alert(opetate(fun,
2
,
3
));
</
SCRIPT
>
<
SCRIPT LANGUAGE
=
"
JavaScript
"
>
var
MyLib
=
{}
;
MyLib.fun1
=
function
()
{}
;
MyLib.fun2
=
function
()
{}
;
alert(MyLib);
alert(MyLib.fun1);
</
SCRIPT
>
在变量里我们知道函数有个预编译过E,q个q程我们也看C刎ͼ另外函数定义不同写法情况也不同。所以,感觉函数的执行过E很是复杂?/p>
<
SCRIPT LANGUAGE
=
"
JavaScript
"
>
fun1();
alert(fun1);
//
///////////把以下代码放到定义最后面可以执行?/span>
fun2();
alert(fun2)
fun3();
alert(fun3)
//
/////////////////////////
function
fun1()
{document.writeln('fun1 run
!
')}
var
fun2
=
function
()
{document.writeln('fun2 run
!
')}
;
var
fun3
=
new
Function(
"
document.writeln('fun3 run!')
"
);
</
SCRIPT
>
a、javascript预编译过E?/strong>Q在html中, </head>前后,<body>内外有特D情况,q指U?js文g中)
javascript的预~译我认为是个很单的q程Q对于解释执行语aQ肯定不?x)编译成什么中间语a。(我认为)q程如下Q?br /> 首先Qؓ(f)执行环境Q一个html也,框架环境下有几个执行环境Q徏立徏立一个全局对象Q一般客L(fng)脚本?window或global对象。(在这我觉得global好理解,因ؓ(f)览器会(x)攑օwindowd他的属性)
然后Q检查某环境中根代码块中Q非函数或{}中)var关键字,把这些变量设|成global对象的属性,q初值undefined.
如果q程中遇到直接定义的函数Qfun1的定义)Q那么把fun1讄成global对象的属性,q初值函数的定义Q你可以把函数当成undefined,true,1,'1'{数据类型)?br />b、解释执行过E?br /> 代码按照序执行Q?br /> 一般我们把全局变量的俯值放C码最前面Q如var s="hello"; 那么把s的值用 'hello'替换预编译过E的undefined?br /> 如果遇到变量的应用,如代码?document.writeln(a)Q如果我们在global扑ֈ属性a,看a是否在前面代码俯DQ如果没有,a的gؓ(f)预编译的undefined。如果是隐式变量声明Q在q把它添加到global的属性中厅R?br /> 如果遇到cMvar fun=function(){}; 把函数当成数据赋值给变量fun.
c、函数的调用q程
你运行一下以下代码,Z么结果是 test undefined local
<
SCRIPT LANGUAGE
=
"
JavaScript
"
>
var
s
=
"
golbe
"
;
function
fun(s)
{
document.writeln(s);
document.writeln(a);
var
s
=
"
local
"
;
var
a
=
""
;
return
s;
}
document.writeln(fun(
"
test
"
));
</
SCRIPT
>
按照序执行函数内代码,当代码中遇到变量Q先从调用对象属性中查找Q如果找到直接用。遇到var s="local";Ӟ代码?x)覆盖调用对象中属性|和参数名U相同)
javascript的函数应该和java中一hU程安全的吧?/span>
a、length
看了以下代码一目了?dng)函数的length代表函数实际需要的参数个数?br />
<
SCRIPT LANGUAGE
=
"
JavaScript
"
>
function
add(x,y)
{
var
actual
=
arguments.length;
var
expected
=
arguments.callee.length;
if
(actual
!=
expected)
{
throw
new
Error('函数需?
+
expected
+
'个参敎ͼ你输入了'
+
actual
+
'?);
}
return
x
+
y;
}
alert(add(
3
,
2
));
alert(add(
3
,
2
,
3
));
</
SCRIPT
>
q个属性引用的是预定义的原型对象,只有在new 函数?才有效。讲解对象时介绍?br />c、定义自q函数属?br />
<
SCRIPT LANGUAGE
=
"
JavaScript
"
>
add.count
=
0
;
function
add(x,y)
{
add.count
++
;
return
x
+
y;
}
add(
3
,
2
);
add(
3
,
2
);
add(
3
,
2
);
add(
3
,
2
);
document.writeln('p用函数几ơ:(x)'
+
add.count);
</
SCRIPT
>
d、apply() call()Ҏ(gu)
去读读prototype.js吧?/p>
大家都知道javascript是可以隐式声名变量的。但要注意,隐式声名变量L被创Zؓ(f)全局变量。看以下代码Q情愿javascript语言强制声明变量。徏议大家一定要var声明变量?br /><SCRIPT LANGUAGE="JavaScript">
function test(){
var a=222;
document.writeln(a);
}
test();
document.writeln(a);
</SCRIPT>
function test(){
a=222;
document.writeln(a);
}
test();
document.writeln(a);
</SCRIPT>
2、关于变量的作用?/font>
猜猜以下代码输出什么?br /><SCRIPT LANGUAGE="JavaScript">
var x='000';
document.writeln(x);
a();
function a(){
var x='aaa';
function b(){
document.writeln(x);
var x='bbb';
document.writeln(x);
}
b();
document.writeln(x);
}
</SCRIPT>
如果你的{案是 ?000 undefined bbb aaa。恭喜,ok.当代码用到x变量Ӟ先从函数块(权威指南中用调用对象来解释)中找Q如果找不到Q从上一U函数块找,直到扑ֈQ如果知道顶层代码(指var x='000';的位|)q没扑ֈ定义Q代码会(x)报未定义错误?/p>
<SCRIPT LANGUAGE="JavaScript">
var x='000';
document.writeln(x);
a();
function a(){
function b(){
document.writeln(x);
document.writeln(x);
}
document.writeln(x);
var x='111';
b();
}
</SCRIPT>
3、新的问?/font>
变量个作用域清楚了,注意上面的代码。ؓ(f)什么我的function a()定义以前可以调用a函数了,而我的var x='111';前“不可以用”x啊?Q?
让我把我的理解一一道来
首先Q以下代码让我相信javascript有个预编译过E,不是完全按照序解释执行的?br /><SCRIPT LANGUAGE="JavaScript">
a();
function a(){
alert();
}
</SCRIPT>
个h理解q个预编译过E不?x)象java/c#那样把代码编译成虚拟识的语言Q更不会(x)象vbQvc那样~译成更底层的语a。猜惛_是把q个函数预装载到q段函数执行的全局环境中,在这个执行环境中Q该函数被标识定义过Q可以直接用了。(看到|上很多人写的AOP的javascript实现,其实q个预编译过E才是翻译元数据最x候,可惜javascript语言来讲Q是有些落伍了)
document.writeln(a);
var a=0;
</SCRIPT>
Z么我要输出undefined呢?Z么我a׃可以预编译一把呢Q?br />大家看看以下两段代码?x)输Z么呢啊?Q?
<SCRIPT LANGUAGE="JavaScript">
document.writeln(a);
a=0;
</SCRIPT>
document.writeln(a);
</SCRIPT>
可能你运行试了,可能你本来就知道Qa未定义。哈哈哈Q好了?br />现在我确信var a=0;被javascript解释器“预~译q”,臛_是记录下来了。甚x它的D|ؓ(f) undefined。“undefined”这个词名字取的很是让h误解Q怎么能叫未定义呢Q分明是javascript中所有变量的初始化倹{关于null与undefined的比较我实在不愿提了?br />注意上面两段代码q反映一个现象。隐式声明的变量是在解释的时候才把自己定义ؓ(f)全局变量的?/p>
4、区别未定义变量和未附值变?br /><SCRIPT LANGUAGE="JavaScript">
var a;
document.writeln(a);
</SCRIPT>
<SCRIPT LANGUAGE="JavaScript">
document.writeln(a);
</SCRIPT>
未定义变量和未附值变量 ?权威指南中文?定义的。通过W三条分析,我觉得变量就应该以 ?定义和未定义变量区别。未附值变量和undefined有点冲突Qjavascript不是强类型语aQ没发附默认|才来了个undefined?br />5、基本类型和引用cd
熟?zhn)java的朋友可能这部分很清楚。没?br />说头?br />6、javascript的垃圑֛?/font>
关于q部分内容一直没见着个权威说法。在javascript权威指南中有两小节提到这个问题?br />对于字符丌Ӏ对象、数据这些没有固定大,必须为它们动态的分配内存Q但什么时候回收这些内存呢Qjavascript使用和java一L(fng)garbage collection的方法?br />var s="hello";
var u=s.toUpperCase();
s=u;
q行q段代码后,"hello"没有变量?x)再用到他,q是"hello"的存储空间的被垃圑֛收了。对于javascript的垃圑֛Ӟ你唯一要关心的是,它一定会(x)q行Q不要对内存担心?br />注意Qjavascript不提供Q何的强制垃圾回收或释攑ֆ存的q算附或语句?br />javascript的deleteq算附和C++中的不同?br /><SCRIPT LANGUAGE="JavaScript">
var o=new Object();
o.name="zkj";
o.age=25;
o.bir=new Date();
for(var key in o){
document.writeln(key+':'+o[key]+'</br>');
}
document.writeln('delete o.bir</br>');
delete o.bir;
for(var key in o){
document.writeln(key+':'+o[key]+'</br>');
}
</SCRIPT>
7、作为属性的变量
猜猜以下代码?x)输Z么?br /><SCRIPT LANGUAGE="JavaScript">
var x=100;
document.writeln(x);
add(x);
document.writeln('</br>------------------------</br>');
var x=200;
document.writeln(x);
add(x);
function add(x){
document.writeln(x);
var x=300;
document.writeln(x);
var x=400;
document.writeln(x);
}
</SCRIPT>
估计很多得出正确{案
100 100 300 400
------------------------
200 200 300 400
但这里我惛_入?全局对象和调用对象的 概念Qjavascript权威指南是这么翻译滴Q?br /><SCRIPT LANGUAGE="JavaScript">
var x=100; //我们在全局对象中加了个属性x. Ҏ(gu)
//var o=new Object();o.x=100;
document.writeln(this.x);//用this讉K全局对象
add(this.x);//把全局对象的属性g递对函数?br />document.writeln('</br>------------------------</br>');
this.x=200;//把全局变量中的x属性修Ҏ(gu)
document.writeln(window.x);
add(window.x);
function add(x){
//假设有个局部对象,调用对象Q函数调用过E中的对?br />// temp temp.x=${传入的值}
document.writeln(x); //哦这打印的可是参C的|也就是temp.x=this.x
//的?
var x=300;//把调用对象变量的{l覆盖了.
document.writeln(x); //打印修改q的倹{?temp.x
var x=400;//temp.x=400
document.writeln(x);
}
</SCRIPT>
在函数的调用q程中,假设有个调用对象存在Q把函数的参敎ͼ和函数内的(f)时变量当成这个调用对象的属性。当然这个调用对象的生命周期很短?br />注意Q当我们讉K全局变量的属性入x的时候,不必要用this.x 或window.x讉KQ当在有<frame><iframe>的页面时?x)出现淆?br />关于函数的详l讨论我后箋?x)详l讨论?br />
]]>
վ֩ģ壺
wwww߹ۿ|
aƬ߹ۿ|
һд|
¼ҳ|
һëƬѿѲ|
18ڵվ
|
˻18س˻18Ƶ|
ƷɫҹƵ|
AVһDV|
һavĻ|
ھƷ99Ѹ|
Ʒһ|
Ļ˳Ӱ|
ɫƵwww|
߿Ƭ˳Ƶ|
x8|
AVպAV뵼|
av뾫Ʒ|
վ18ѹۿ|
Ʒ|
þþþþþ|
ԾƷAAƬ߲|
999þþѾƷ|
ëƬavպav|
˳|
ѹۿ91Ƶ|
Ʒ99߹ۿ|
ɫ˵|
þùƷѹۿ|
߹ۿ|
ݺۺϾþ|
ŷƵһ|
ɫ͵С˵|
gayˬˬƵ|
鶹һѲվ|
Ʒþһ|
Ƶ|
ƷƵƵѿ|
av|
һػaaëƬѹۿ|
ĻƷ
|