87,955
社区成员
![](https://csdnimg.cn/release/cmsfe/public/img/topic.427195d5.png)
![](https://csdnimg.cn/release/cmsfe/public/img/me.40a70ab0.png)
![](https://csdnimg.cn/release/cmsfe/public/img/task.87b52881.png)
![](https://csdnimg.cn/release/cmsfe/public/img/share-circle.3e0b7822.png)
<?xml version="1.0" encoding="utf-8"?>
501
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>simpleRequest</title>
<script language=javascript>
var xmlHttp;
<!--创建XMLHttpRequest对象-->
function createXMLHttpRequest()
{
//判断浏览器是否支持ActiveXObject对象
if(window.ActiveXObject)
{
xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
}
//判断浏览器是否支持XMLHttpRequest对象
else if (window.XMLHttpRequest)
{
xmlHttp = new XMLHttpRequest();
}
}
<!--向服务器请求-->
function startRequest()
{
createXMLHttpRequest();
//设置在请求结束后调用handleStateChange函数
xmlHttp.onreadystatechange = handleStateChange;
//用get方法请求服务器端的simple.xml
xmlHttp.open("GET","simple.xml",true)
//发送请求
xmlHttp.send(null);
}
<!--如果一切正常,在客户端显示simple.xml中的内容-->
function handleStateChange()
{
if(xmlHttp.readyState == 4)
{
if(xmlHttp.status == 200)
{
alert(xmlHttp.responseText);
}
}
}
</script>
</head>
<body>
<form action="GET">
<p><input name="" type="submit" value="提交"/></p>
</form>
<form action="#">
<p><input type="button" value="按钮" name="B3" onclick="startRequest();"></p>
</form>
</body>
</html>
(function() {
/*
* 创建一个私有class
* @param {Object} els arguments 所有参数组成的类数组
*/
function _$(els) {
this.elements = []; //存放HTML元素
for(var i=0, len=els.length; i<len; i++) {
var element = els[i];
if(typeof element === 'string') {
element = document.getElementById(element);
}
this.elements.push(element);
}
}
//对HTML元素可执行的操作
_$.prototype = {
each: function() {},
setStyle: function() {},
show: function() {},
addEvent: function() {},
};
//对外开放的接口
window.$ = function() {
return new _$(arguments);
};
})();
(function() {
/*
* 创建一个私有class
* @param {Object} els arguments 所有参数组成的类数组
*/
function _$(els) {
//...
}
//对HTML元素可执行的操作
_$.prototype = {
each: function(fn) { //fn 回调函数
for(var i=0; i<this.elements.length; i++) {
//执行len次,每次把一个元素elements[i]作为参数传递过去
fn.call(this, this.elements[i]);
}
return this;
},
setStyle: function(prop, value) {
this.each(function(el) {
el.style[prop] = value;
});
return this;
},
show: function() {
var that = this;
this.each(function(el) {
that.setStyle('display', 'block');
});
return this;
},
addEvent: function(type, fn) {
var addHandle = function(el) {
if(document.addEventListener) {
el.addEventListener(type, fn, false);
}else if(document.attachEvent) {
el.attachEvent('on'+type, fn);
}
};
this.each(function(el) {
addHandle(el);
});
return this;
}
};
//对外开放的接口
window.$ = function() {
return new _$(arguments);
}
})();
//----------------------- test --------
$(window).addEvent('load', function() {
$('test-1', 'test-2').show()
.setStyle('color', 'red')
.addEvent('click', function() {
$(this).setStyle('color', 'green');
});
})
window.API = window.API || function() {
var name = 'mackxu';
//特权方法
this.setName = function(name0) {
name = name0;
return this;
};
this.getName = function(callback) {
callback.call(this, name);
return this;
};
};
//------------- test ---
var obj = new API();
obj.getName(console.log).setName('zhangsan').getName(console.log);
Function.prototype.method = function(name, fn) {
this.prototype[name] = fn;
return this;
};
(function() {
function _$(els) {
//...
}
/*
* Events
* addEvent
* removeEvent
*/
_$.method('addEvent', function(type, fn) {
//...
}).method('removeEvent', function(type, fn) {
})
/*
* DOM
* addClass
* removeClass
* hover
* hasClass
* getClass
* getStyle
* setStyle
*/
.method('addClass', function(classname) {
//...
}).method('removeClass', function(classname) {
//...
}).method('hover', function(newclass, oldclass) {
//...
}).method('hasClass', function(classname) {
//...
}).method('getClass', function(classname) {
//...
}).method('getStyle', function(prop) {
//...
}).method('setStyle', function(prop, val) {
//...
})
/*
* AJAX
* ajax
*/
.method('ajax', function(url, method) {
//...
});
window.$ = function() {
return new _$(arguments);
};
//解决JS库命名冲突问题
window.installHelper = function(scope, interface) {
scope[interface] = function() {
return _$(arguments)
}
}
})();
_$.prototype = {
each: function() {},
setStyle: function() {},
show: function() {},
addEvent: function() {},
};
Date.prototype.format = function(format) {
var o = {
"M+": this.getMonth() + 1, // month
"d+": this.getDate(), // day
"h+": this.getHours(), // hour
"m+": this.getMinutes(), // minute
"s+": this.getSeconds(), // second
"q+": Math.floor((this.getMonth() + 3) / 3), // quarter
"S": this.getMilliseconds()
// millisecond
}
"M+": 这个是什么意思?
<html>
<title>-</title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<script>
Date.prototype.format = function(format) {
var o = {
"M+": this.getMonth() + 1, // month
"d+": this.getDate(), // day
"h+": this.getHours(), // hour
"m+": this.getMinutes(), // minute
"s+": this.getSeconds(), // second
"q+": Math.floor((this.getMonth() + 3) / 3), // quarter
"S": this.getMilliseconds()
// millisecond
}
if (/(y+)/.test(format)) {
format = format.replace(RegExp.$1, (this.getFullYear() + "")
.substr(4 - RegExp.$1.length));
}
for (var k in o) {
if (new RegExp("(" + k + ")").test(format)) {
format = format.replace(RegExp.$1, RegExp.$1.length == 1 ? o[k]
: ("00" + o[k]).substr(("" + o[k]).length));
}
}
return format;
}
//四舍五入 v表示要转换的值 e表示要保留的位数
function round(v, e) {
var t = 1;
for (; e > 0; t *= 10, e--);
for (; e < 0; t /= 10, e++);
return Math.round(v * t) / t;
}
//本月第一天
function showMonthFirstDay() {
var Nowdate = new Date();
var MonthFirstDay = new Date(Nowdate.getYear(), Nowdate.getMonth(), 1);
return MonthFirstDay;
}
//下月第一天
function showNextFirstDay() {
var MonthFirstDay = showMonthFirstDay()
return new Date(MonthFirstDay.getYear(), MonthFirstDay.getMonth() + 1, 1)
}
/* 得到日期年月日等加数字后的日期 */
Date.prototype.dateAdd = function(interval, number) {
var d = this;
var k = { 'y': 'FullYear', 'q': 'Month', 'm': 'Month', 'w': 'Date', 'd': 'Date', 'h': 'Hours', 'n': 'Minutes', 's': 'Seconds', 'ms': 'MilliSeconds' };
var n = { 'q': 3, 'w': 7 };
eval('d.set' + k[interval] + '(d.get' + k[interval] + '()+' + ((n[interval] || 1) * number) + ')');
return d;
}
/* 计算两日期相差的日期年月日等 */
Date.prototype.dateDiff = function(interval, objDate2) {
var d = this, i = {}, t = d.getTime(), t2 = objDate2.getTime();
i['y'] = objDate2.getFullYear() - d.getFullYear();
i['q'] = i['y'] * 4 + Math.floor(objDate2.getMonth() / 4) - Math.floor(d.getMonth() / 4);
i['m'] = i['y'] * 12 + objDate2.getMonth() - d.getMonth();
i['ms'] = objDate2.getTime() - d.getTime();
i['w'] = Math.floor((t2 + 345600000) / (604800000)) - Math.floor((t + 345600000) / (604800000));
i['d'] = Math.floor(t2 / 86400000) - Math.floor(t / 86400000);
i['h'] = Math.floor(t2 / 3600000) - Math.floor(t / 3600000);
i['n'] = Math.floor(t2 / 60000) - Math.floor(t / 60000);
i['s'] = Math.floor(t2 / 1000) - Math.floor(t / 1000);
return i[interval];
}
function chktable() {
if (document.getElementById("payNum").value == "" || document.getElementById("payNum").value.search("^[0-9]*$") == -1) {
document.getElementById("errmsg").style.display = "block";//判断payNum是否为空或不是数字 提示错误
document.getElementById("errmsg").innerHTML = "提示信息:期数为空或不是数字!";
}
else {
document.getElementById("errmsg").style.display = "none";//隐藏提示信息
var moneyAmount = parseFloat(document.getElementById("moneyAmount").innerText); //获取总金额
var payNum = parseInt(document.getElementById("payNum").value); //获取分期数
var startTime = document.getElementById("beginjsdate").value; //获取开始还款日期
var myDate = new Date(startTime.substring(0, 4), startTime.substring(5, 7), startTime.substring(8, 10));//转化时间类型
var moneythen = 0; //已还款
if (myDate.getDate() > 28) {// myDate.getDate(); //获取当前日(1-31)
//如果天数大于28,就到下一个月1号开始还
myDate = showNextFirstDay(myDate);
}
var timedate = myDate.dateAdd('m', -2); //当前月份减2
var flag = true;
var data = "";
data += " <table width='750' border='0' cellspacing='0' cellpadding='0' class='pagetab' align='left'>";
data += " <tr class='header'>" +
"<td align='center' width='30' rowspan='2'>期次</td>" +
"<td align='center' rowspan='2'>还款方式</td>" +
"<td colspan='2' align='center '>各期金额</td>" +
"<td align='center' width='80' rowspan='2'>利率</td>" +
"<td align='center' width='100' rowspan='2'>计划还款日期</td>" +
"<td align='center' rowspan='2' width='150px'>备注</td>" +
"</tr>" +
"<tr class='header'>" +
"<td align='center' width='100'>本期金额</td>" +
"<td align='center' width='100'>还款余额</td>" +
"</tr>";
for (var i = 1; i <= payNum; i++) {
moneythen += moneyAmount / payNum;
timedate = myDate.dateAdd('m', 1);
timedate = timedate.format('yyyy-MM-dd');
data += "<tr height='22'>";
data += "<td>" + i + "</td>";
data += "<td>分期付款</td>";
data += "<td><input name='capital' id='capital_" + i + "' type='text' style='text-align:right;' size='11' maxlength='100' class='input' isNull='false' dataType='filter' value='" + round(moneyAmount / payNum, 2) + "' tipMsg='各期金额' Onchange='textToChange(" + i + ")'></td>";
data += "<td align='right' id='balance_" + i + "'>" + round((moneyAmount - moneythen), 2) + "</td>";
data += "<td align='right'>0.058</td>";
data += "<td><input name='repayment' id='repayment_" + i + "' type='text' size='10' maxlength='64' value='" + timedate+ "'class='readonly input' readonly ></td>";
data += "<td><input name='remarks' id='remarks_" + i + "' type='text' size='20' maxlength='100' class='input'></td>";
data += "</tr>";
}
data += " <tr class='header'>";
data += "<td> </td>";
data += "<td> </td>";
data += "<td><div id='div2' style='display: none'></div></td>";
data += "<td align='right'></td>";
data += "<td align='right'></td>";
data += "<td> </td>";
data += "<td> </td>";
data += "</tr>";
data += "</table>";
document.getElementById("div1").style.display = "block";
document.getElementById("table1").innerHTML = data;
}
}
function textToChange(num) {
if (document.getElementById("capital_" + num).value == "" || document.getElementById("capital_" + num).value.search("^[0-9]+(.[0-9]{1,2})?$") == -1) {
document.getElementById("errmsg").style.display = "block";
document.getElementById("errmsg").innerHTML = "提示信息:本金为空或不是数字!";
}
else {
document.getElementById("errmsg").style.display = "none";
var moneyAmount = parseFloat(document.getElementById("moneyAmount").innerText); //获取总金额
var capitals = document.getElementsByName("capital");
var tmpAmt = 0;
var textdiv2 = "合计:<font color='#006600'>";
for (var i = 0; i < capitals.length; i++) {
tmpAmt += parseFloat(capitals[i].value);
if (i >= (num - 1)) {
document.getElementById("balance_" + (i + 1)).innerHTML = round((moneyAmount - tmpAmt), 2);//更新本金余额
}
}
textdiv2 += round((tmpAmt), 2) + "</font> ";
if ((moneyAmount - tmpAmt) >= 0) {
textdiv2 += "<font color='red'>-" + round((moneyAmount - tmpAmt), 2) + "</font>";
}
else {
textdiv2 += "<font color='#006600'>+" + round((tmpAmt - moneyAmount), 2) + "</font>";
}
document.getElementById("div2").style.display = "block";
document.getElementById("div2").innerHTML = textdiv2;
}
}
</script>
</head>
</html>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>无标题文档</title>
<script type="text/javascript">
function foo()
{
alert("测试");
}
foo();
function Car(color,door){
var ocar = new Object;
ocar.color = color;
ocar.doors = door;
ocar.showColor = function(){
alert(this.color)
};
return ocar;
}
var car1 = Car("red",4);
var car2 = Car("blue",4);
car1.showColor() //output:"red"
car2.showColor() //output:"blue"
</script>
</head>
<body>
<script type="text/javascript">
/*
js并不是一种面向对向的语言, 没有提供对类的支持, 因此我们不能像在传统的语言里那样用class来定义类,
但我们可以利用js的闭包封装机制来实现js类, 我们来封装一个简的Shape类.
*/
/*
function ShapeBase()
{
this.show = function()
{
alert("ShapeBase show");
};
this.init = function()
{
alert("ShapeBase init");
};
}
*/
/*
这个类里定义了两个方法:show和init, 需要注意的是这里用到了this来声明, 而不是var, 因为用var是用来定义私有方法的
另外, 我们还可以用prototype属性来定义Shape的方法
*/
/*
ShapeBase.prototype.show=function()
{
alert("ShapeBase show");
}
ShapeBase.prototype.init=function()
{
alert("ShapeBase init");
}
*/
//上面这种写法看起来不太直观,我们可以将所有的方法写在一起
function ShapeBase()
{
}
/*
ShapeBase.prototype=
{
show:function()
{
alert("ShapeBase show");
},
init:function()
{
alert("ShapeBase init");
}
};
*/
function test(){
var s=new ShapeBase();
s.init();
s.show();
ShapeBase.StaticDraw();
}
/*
看到了吧, 其调用方式和C#一模一样, 而结果也如我们所料
到目前为止, 我们学会了如何创建js的类了, 但还只是实例方法,要是实现跟C#中的静态方法要怎么做呢?
其实, 实现js的静态方法很简单, 看下面如何实现
*/
//静态方法
ShapeBase.StaticDraw = function()
{
alert("method draw is static");
}
/*
实现JS类抽象和继承
同样, js中也不支持类继承机制,但我们可以通过将父类prototype中的成员方法复制到子类的prototype中来实现
和类的继承一样,JavaScript也没有任何机制用于支持抽象类.但利用JavaScript语言本身的性质.可以实现自己的抽象类
首先来看看js中的虚方法, 在传统语言中虚方法是要先定义的, 而包含虚方法的类就是抽象类,不能被实例化
而在JavaScript中,虚方法就可以看作该类中没有定义的方法,但已经通过this指针使用了
和传统面向对象不同的是,这里虚方法不需经过声明,而直接使用了, 并且类也可以被实例化
先定义object的extend方法, 一个为静态方法,一个为实例方法, 这两个方法用于实现继承的prototype复制
*/
Object.extend = function(destination, source) {
for (property in source) {
destination[property] = source[property];
}
return destination;
}
Object.prototype.extend = function(object) {
return Object.extend.apply(this, [this, object]);
}
//接下来我们实现一个继承类Rect, 这里先用一种简单的方法来实现
function Rect() {
}
Rect.prototype = ShapeBase.prototype; //只这一句就行了
//扩充新的方法
Rect.prototype.add=function() {
alert("Rect add");
}
/*
这种方法不能用于重写,如果改变了show方法, ShapeBase的show也会指向同一函数可能是由于prototype赋值只是简单的改变指向地址
如果上面也定义了
*/
Rect.prototype.show=function() {
alert("Rect show");
}
/*
那么执行结果如下:
function test(){
var s=new ShapeBase();
s.show(); //结果:Rect show
var r=new Rect();
r.show(); //结果:Rect show
r.add();
}
*/
//我们再使用object.extend实现继承, 并实现一个oninit虚方法, 修改ShapeBase如下
ShapeBase.prototype={
show:function()
{
alert("ShapeBase show");
},
initialize:function () {
this.oninit();
}
};
//实现Rect类继承
Rect.prototype=(new ShapeBase).extend({
//添加新的方法
add:function() {
alert("Rect add");
},
//使用这种方法可以重写show方法
show:function() {
alert("Rect show");
},
//实现虚方法
oninit:function() {
alert("Rect oninit");
}
})
function test2(){
ShapeBase.StaticDraw();
var s=new ShapeBase();
s.show(); //alert("ShapeBase show")
var r=new Rect();
r.show(); //alert("Rect show")
r.add();
r.initialize(); //alert("Rect oninit")
}
</script>
<!--
<input name="" type="button" value="test" onclick="test()"/>
-->
<input name="" type="button" value="test2" onclick="test2()"/>
</body>
</html>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>无标题文档</title>
<script type="text/javascript">
function foo()
{
alert("测试");
}
foo();
function Car(color,door){
var ocar = new Object;
ocar.color = color;
ocar.doors = door;
ocar.showColor = function(){
alert(this.color)
};
return ocar;
}
var car1 = Car("red",4);
var car2 = Car("blue",4);
car1.showColor() //output:"red"
car2.showColor() //output:"blue"
</script>
</head>
<body>
<script type="text/javascript">
/*
js并不是一种面向对向的语言, 没有提供对类的支持, 因此我们不能像在传统的语言里那样用class来定义类,
但我们可以利用js的闭包封装机制来实现js类, 我们来封装一个简的Shape类.
*/
/*
function ShapeBase()
{
this.show = function()
{
alert("ShapeBase show");
};
this.init = function()
{
alert("ShapeBase init");
};
}
*/
/*
这个类里定义了两个方法:show和init, 需要注意的是这里用到了this来声明, 而不是var, 因为用var是用来定义私有方法的
另外, 我们还可以用prototype属性来定义Shape的方法
*/
/*
ShapeBase.prototype.show=function()
{
alert("ShapeBase show");
}
ShapeBase.prototype.init=function()
{
alert("ShapeBase init");
}
*/
//上面这种写法看起来不太直观,我们可以将所有的方法写在一起
function ShapeBase()
{
}
ShapeBase.prototype=
{
show:function()
{
alert("ShapeBase show");
},
init:function()
{
alert("ShapeBase init");
}
};
//静态方法
ShapeBase.StaticDraw = function()
{
alert("method draw is static");
}
function test(){
var s=new ShapeBase();
s.init();
s.show();
ShapeBase.StaticDraw();
}
/*
看到了吧, 其调用方式和C#一模一样, 而结果也如我们所料
到目前为止, 我们学会了如何创建js的类了, 但还只是实例方法,要是实现跟C#中的静态方法要怎么做呢?
其实, 实现js的静态方法很简单, 看下面如何实现
*/
</script>
<input name="" type="button" value="test" onclick="test()"/>
</body>
</html>
(function() {
/*
* 创建一个私有class
* @param {Object} els arguments 所有参数组成的类数组
*/
function _$(els) {
//...
}
//对HTML元素可执行的操作
_$.prototype = {
each: function(fn) { //fn 回调函数
for(var i=0; i<this.elements.length; i++) {
//执行len次,每次把一个元素elements[i]作为参数传递过去
fn.call(this, this.elements[i]);
}
return this;
},
setStyle: function(prop, value) {
this.each(function(el) {
el.style[prop] = value;
});
return this;
},
show: function() {
var that = this;
this.each(function(el) {
that.setStyle('display', 'block');
});
return this;
},
addEvent: function(type, fn) {
var addHandle = function(el) {
if(document.addEventListener) {
el.addEventListener(type, fn, false);
}else if(document.attachEvent) {
el.attachEvent('on'+type, fn);
}
};
this.each(function(el) {
addHandle(el);
});
return this;
}
};
//对外开放的接口
window.$ = function() {
return new _$(arguments);
}
})();
//----------------------- test --------
$(window).addEvent('load', function() {
$('test-1', 'test-2').show()
.setStyle('color', 'red')
.addEvent('click', function() {
$(this).setStyle('color', 'green');
});
})
$(window)为什么要这么写?
el在这里是什么意思?
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>LJ</title>
</head>
<body>
<script type="text/javascript">
function dw(message){return document.write(message);}
function dwb(message){return document.write(message+"<br />");}
/*
javascript的方法可以分为三类:
a 类方法
b 对象方法
c 原型方法
*/
function People(name)
{
this.name=name;
//对象方法
this.Introduce=function(){
dwb("My name is "+this.name);
}
}
//类方法
People.Run=function(){
dwb("I can run")
//alert("I can run");
}
//原型方法
People.prototype.IntroduceChinese=function(){
dwb("我的名字是"+this.name);
//alert("我的名字是"+this.name);
}
//测试
var p1=new People("Windking");
p1.Introduce();
People.Run();
p1.IntroduceChinese();
/*
prototype是什么含义?
javascript中的每个对象都有prototype属性,Javascript中对象的prototype属性的解释是:返回对象类型原型的引用。
A.prototype = new B();
理解prototype不应把它和继承混淆。A的prototype为B的一个实例,可以理解A将B中的方法和属性全部克隆了一遍。A能使用B的方法和属性。
这里强调的是克隆而不是继承。可以出现这种情况:A的prototype是B的实例,同时B的prototype也是A的实例。
先看一个实验的例子
function baseClass()
{
this.showMsg = function()
{
//alert("baseClass::showMsg");
document.write("baseClass::showMsg"+"<br />");
}
}
function extendClass()
{
document.write("extendClass"+"<br />");
}
extendClass.prototype = new baseClass();
var instance = new extendClass();
instance.showMsg(); // 显示baseClass::showMsg
*/
/*
我们首先定义了baseClass类,然后我们要定义extentClass
但是我们打算以baseClass的一个实例为原型,来克隆的extendClass也同时包含showMsg这个对象方法。
extendClass.prototype = new baseClass()就可以阅读为:extendClass是以baseClass的一个实例为原型克隆创建的。
那么就会有一个问题,如果extendClass中本身包含有一个与baseClass的方法同名的方法会怎么样?
下面是扩展实验2:
*/
function baseClass()
{
this.showMsg = function()
{
dwb("baseClass::showMsg");
}
}
function extendClass()
{
this.showMsg =function ()
{
dwb("extendClass::showMsg");
}
}
extendClass.prototype = new baseClass();
var instance = new extendClass();
instance.showMsg();//显示extendClass::showMsg
/*
function baseClass1()
{
this.showMsg = function()
{
//alert("baseClass::showMsg");
dwb("baseClass::showMsg");
}
}
function extendClass1()
{
this.showMsg =function ()
{
//alert("extendClass::showMsg");
dwb("extendClass::showMsg");
}
}
extendClass1.prototype = new baseClass1();
var instance1 = new extendClass1();
instance1.showMsg();//显示extendClass::showMsg
*/
/*
实验证明:函数运行时会先去本体的函数中去找,如果找到则运行,找不到则去prototype中寻找函数。或者可以理解为prototype不会克隆同名函数。
那么又会有一个新的问题:
如果我想使用extendClass的一个实例instance调用baseClass的对象方法showMsg怎么办?
答案是可以使用call:
*/
extendClass.prototype = new baseClass();
var instance = new extendClass();
var baseinstance = new baseClass();
baseinstance.showMsg.call(instance);//显示baseClass::showMsg
/*
这里的baseinstance.showMsg.call(instance);阅读为“将instance当做baseinstance来调用,调用它的对象方法showMsg”
好了,这里可能有人会问,为什么不用baseClass.showMsg.call(instance);
这就是对象方法和类方法的区别,我们想调用的是baseClass的对象方法
*/
</script>
</body>
</html>