??xml version="1.0" encoding="utf-8" standalone="yes"?> 用法Q?br> 也就是从对象的v始位|到l止位置的全部内?包括Html标签?/p>
上例中的test.innerHTML的g是“<span style="color:red">test1</span> test2 ”?br> 从v始位|到l止位置的内? 但它去除Html标签 上例中的text.innerTest的g是“test1 test2”, 其中span标签去除了?/p>
test.outerHTML: 除了包含innerHTML的全部内容外, q包含对象标{本w?/p>
上例中的text.outerHTML的g是<div id="test"><span style="color:red">test1</span> test2</div> <div id="test"> innerHTML是符合W3C标准的属性,而innerText只适用于IE览器,因此Q尽可能地去使用innerHTMLQ而少用innerTextQ如果要输出不含HTML标签的内容,可以使用innerHTML取得包含HTML标签的内容后Q再用正则表辑ּ去除HTML标签Q下面是一个简单的W合W3C标准的示例:
在JavaScript中可以用function关键字来定义一?#8220;c?#8221;Q如何ؓcL加成员。在函数内通过this指针引用的变量或者方法都会成为类的成员,例如Q?br>
E序代码
function class1(){
var s="abc";
this.p1=s;
this.method1=function(){
alert("this is a test method");
}
}
var obj1=new class1();
通过new class1()获得对象obj1Q对象obj1便自动获得了属性p1和方法method1?br>
在JavaScript中,function本n的定义就是类的构造函敎ͼl合前面介绍q的对象的性质以及new操作W的用法Q下面介l用new创徏对象的过E?br> Q?Q当解释器遇到new操作W时便创Z个空对象Q?br> Q?Q开始运行class1q个函数Qƈ其中的this指针都指向这个新建的对象Q?br> Q?Q因为当l对象不存在的属性赋值时Q解释器׃为对象创属性,例如在class1中,当执行到this.p1=sq条语句Ӟ׃d一个属性p1Qƈ把变量s的Dl它Q这样函数执行就是初始化q个对象的过E,卛_现构造函数的作用Q?br> Q?Q当函数执行完后Qnew操作W就q回初始化后的对象?br>
通过q整个过E,JavaScript中就实现了面向对象的基本机制。由此可见,在JavaScript中,function的定义实际上是实现一个对象的构造器Q是通过函数来完成的。这U方式的~点是:
·所有的初始化语句、成员定义都攑ֈ一P代码逻辑不够清晰Q不易实现复杂的功能?br> ·每创Z个类的实例,都要执行一ơ构造函数。构造函C定义的属性和Ҏ总被重复的创建,例如Q?br>
E序代码
this.method1=function(){
alert("this is a test method");
}
q里的method1每创Z个class1的实例,都会被创Zơ,造成了内存的费。下一节介l另一U类定义的机Ӟprototype对象Q可以解x造函C定义cL员带来的~点?br>
使用prototype对象定义cL?/strong>
现在介绍另一UؓcL加成员的机制Qprototype对象。当new一个functionӞ该对象的成员自动赋l所创徏的对象,例如Q?br>
E序代码
Qscript language="JavaScript" type="text/javascript"Q?br>Q?--
//定义一个只有一个属性prop的类
function class1(){
this.prop=1;
}
//使用函数的prototype属性给cd义新成员
class1.prototype.showProp=function(){
alert(this.prop);
}
//创徏class1的一个实?br> var obj1=new class1();
//调用通过prototype原型对象定义的showPropҎ
obj1.showProp();
//--Q?br>Q?scriptQ?
prototype是一个JavaScript对象Q可以ؓprototype对象d、修攏V删除方法和属性。从而ؓ一个类d成员定义?br>
了解了函数的prototype对象Q现在再来看new的执行过E?br> Q?Q创Z个新的对象,q让this指针指向它;
Q?Q将函数的prototype对象的所有成员都赋给q个新对象;
Q?Q执行函CQ对q个对象q行初始化操作;
Q?Q返回(1Q中创徏的对象?br>
和new的执行过E相比,多了用prototype来初始化对象的过E,q也和prototype的字面意思相W,它是所对应cȝ实例的原型。这个初始化q程发生在函CQ构造器Q执行之前,所以可以在函数体内部调用prototype中定义的属性和ҎQ例如:
E序代码
Qscript language="JavaScript" type="text/javascript"Q?br>Q?--
//定义一个只有一个属性prop的类
function class1(){
this.prop=1;
this.showProp();
}
//使用函数的prototype属性给cd义新成员
class1.prototype.showProp=function(){
alert(this.prop);
}
//创徏class1的一个实?br>var obj1=new class1();
//--Q?br>Q?scriptQ?
和上一D代码相比,q里在class1的内部调用了prototype中定义的ҎshowPropQ从而在对象的构造过E中弹Z对话框,昄prop属性的gؓ1?br>
需要注意,原型对象的定义必d创徏cd例的语句之前Q否则它不会v作用Q例如:
E序代码
Qscript language="JavaScript" type="text/javascript"Q?br>Q?--
//定义一个只有一个属性prop的类
function class1(){
this.prop=1;
this.showProp();
}
//创徏class1的一个实?br>var obj1=new class1();
//在创建实例的语句之后使用函数的prototype属性给cd义新成员Q只会对后面创徏的对象有?br>class1.prototype.showProp=function(){
alert(this.prop);
}
//--Q?br>Q?scriptQ?
q段代码会产生q行旉误,昄对象没有showPropҎQ就是因Ҏ的定义是在实例化一个类的语句之后?br>
由此可见Qprototype对象专用于设计类的成员,它是和一个类紧密相关的,除此之外Qprototypeq有一个重要的属性:constructorQ表C对该构造函数的引用Q例如:
E序代码
function class1(){
alert(1);
}
class1.prototype.constructor(); //调用cȝ构造函?
q段代码q行后将会出现对话框Q在上面昄文字“1”Q从而可以看Z个prototype是和一个类的定义紧密相关的。实际上Qclass1.prototype.constructor===class1?br>
一UJavaScriptcȝ设计模式
前面已经介绍了如何定义一个类Q如何初始化一个类的实例,且类可以在function定义的函C中添加成员,又可以用prototype定义cȝ成员Q编E的代码昑־混ؕ。如何以一U清晰的方式来定义类呢?下面l出了一U类的实现模式?br>
在JavaScript中,׃对象灉|的性质Q在构造函C也可以ؓcL加成员,在增加灵zL的同时Q也增加了代码的复杂度。ؓ了提高代码的可读性和开发效率,可以采用q种定义成员的方式,而用prototype对象来替代,q样function的定义就是类的构造函敎ͼW合传统意义cȝ实现Q类名和构造函数名是相同的。例如:
E序代码
function class1(){
//构造函?br>}
//成员定义
class1.prototype.someProperty="sample";
class1.prototype.someMethod=function(){
//Ҏ实现代码
}
虽然上面的代码对于类的定义已l清C很多Q但每定义一个属性或ҎQ都需要用一ơclass1.prototypeQ不仅代码体U变大,而且易读性还不够。ؓ了进一步改q,可以使用无类型对象的构造方法来指定prototype对象Q从而实现类的成员定义:
E序代码
//定义一个类class1
function class1(){
//构造函?br>}
//通过指定prototype对象来实现类的成员定?br>class1.prototype={
someProperty:"sample", someMethod:function(){
//Ҏ代码
},
…//其他属性和Ҏ.
}
上面的代码用一U很清晰的方式定义了class1Q构造函数直接用cd来实玎ͼ而成员用无cd对象来定义,以列表的方式实现了所有属性和ҎQƈ且可以在定义的同时初始化属性的倹{这也更象传l意义面向对象语a中类的实现。只是构造函数和cȝ成员定义被分Z两个部分Q这可看成JavaScript中定义类的一U固定模式,q样在用时会更加容易理解?br>
注意Q在一个类的成员之间互相引用,必须通过this指针来进行,例如在上面例子中的someMethodҎ中,如果要用属性somePropertyQ必通过this.someProperty的Ş式,因ؓ在JavaScript中每个属性和Ҏ都是独立的,它们通过this指针联系在一个对象上?
]]>
<div id="test">
<span style="color:red">test1</span> test2
</div>
在JS中可以用:
test.innerHTML:
test.innerText:
完整CZQ?/strong>
<span style="color:red">test1</span> test2
</div>
<a href="javascript:alert(test.innerHTML)">innerHTML内容</a>
<a href="javascript:alert(test.innerText)">inerHTML内容</a>
<a href="javascript:alert(test.outerHTML)">outerHTML内容</a>
特别说明Q?/strong>
<a href="javascript:alert(document.getElementById('test').innerHTML.replace(/<.+?>/gim,''))">无HTML,W合W3C标准</a>
]]>
function document.onclick()
{
alert("in the document's event handler!");
}
function clickMe()
{
alert("in the button's event handler!");
// event.cancelBubble = true;
}
</script>
<input type="button" value="click me" onclick="clickMe()">
]]>