一.prototype原型对象,需要注意的原则是:
(1). 使用原型可以大量减少每个对象对内存的需求量,因为对象可以继承许多属性。
(2). 即使属性在对象被创建之后才被添加至原型中,对象也能够继承这些属性。
示例代码:
prototype调用
function print(msg)
{
document.write(msg,'<br/>');
}
function printhr()
{
document.write('<hr/>');
}
print("prototype属性:<br/>"+
"1. 使用原型可以大量减少每个对象对内存的需求量,因为对象可以继承许多属性。<br/>"+
"2. 即使属性在对象被创建之后才被添加至原型中,对象也能够继承这些属性。");
printhr();
function User(name)
{
this.name=name;
}
var zhang = new User('老张');
zhang.favchannel ='hello';
User.prototype.favchannel='CCTV';
Object.prototype.qq ='569723660';
print(zhang.favchannel);
print(zhang.qq);
</script>
运行结果为:
prototype属性:
1. 使用原型可以大量减少每个对象对内存的需求量,因为对象可以继承许多属性。
2. 即使属性在对象被创建之后才被添加至原型中,对象也能够继承这些属性。
hello
569723660
二.setTimeout和setInterval 两个函数都定义在window对象中。setTimeout(fun_name,time_minisec)作用是在time时间后运行fun_name函数一次;setInterval(fun_name,time_minisec)作用是每隔time_sec时间都去运行fun_name函数。
示例代码如下:
代码
<head></head>
<body>
<div id="show"></div>
<input type="button" value='' id='btntime'></input>
<script type='text/javascript'>
function print(msg)
{
document.write(msg,'<br/>');
}
var changetime = function()
{
var d=new Date();
var h=d.getHours();
var m=d.getMinutes();
var sec=d.getSeconds();
var ampm=(h>=12)?'PM':'AM';
if(h>12) h-=12;
if(h==0)h=12;
if(m<10) m='0'+m;
var t=h+':'+m+':'+sec+" "+ampm;
var button = document.getElementById('btntime');
button.value = "setInterval:"+t;
}
changetime();
setInterval("changetime()",1000);
function time_setTimeOut()
{
var d=new Date();
var h=d.getHours();
var m=d.getMinutes();
var sec=d.getSeconds();
var ampm=(h>=12)?'PM':'AM';
if(h>12) h-=12;
if(h==0)h=12;
if(m<10) m='0'+m;
var t=h+':'+m+':'+sec+" "+ampm;
document.getElementById('show').innerHTML='setTimeout:'+t;
setTimeout('time_setTimeOut()',1000);
}
time_setTimeOut();
</script>
</body>
</html>
三.本地对象,内置对象和宿主对象
1.本地对象包含的内容有 Object、Function、Array、String、Boolean、Number、Date、RegExp、Error、EvalError、RangeError、ReferenceError、SyntaxError、TypeError、URIError 都是一些 ECMA-262 定义的引用类型。
2.内置对象:由 ECMAScript 实现提供的、独立于宿主环境的所有对象,在 ECMAScript 程序开始执行时出现(ECMA-262定义), 内置对象只有两个Global 和 Math ,它们都是本地对象。内置对象就是一种特殊的本地对象。
3.宿主对象:所有非本地对象都是宿主对象(host object),即由 ECMAScript 实现的宿主环境提供的对象。
总之,本地对象,就是那些官方定义好了的对象。内置对象是本地对象的一种,其只包含Global对象和Math对象。而宿主对象则是那些官方未定义,你自己构建的对象加上DOM和BOM对象组成的。
四.Array.prototype.slice.call(_array,begin[,end]) 的使用相当于_array.slice(begin[,end]),不过Array.prototype.slice.call的效率要远远高过第二种用法。
示例:
function p(msg)
{
document.write(msg,'<br/>');
}
p(Array.prototype.slice.call([1,2,3,4],2));
p([1,2,3,4].slice(2));
运行结果:
3,4
3,4
javscript中定义和声明函数有三种方式:正常方法 构造函数 函数直接量。
以下是各种方法的示例代码
代码
<head></head>
<body>
<script type="text/javascript">
/*javascript定义函数(声明函数)可以有三种方法:正常方法、构造函数、函数直接量。*/
/*1.正常方法 function(param){}*/
function print(msg)
{
document.write(msg,"<br/>");
}
/*如果函数不包含return 语句,只执行函数体内语句,并返回undefined*/
/*2.构造函数方法:new Function()*/
var add1=new Function('a','b','return a+b');
/*3.函数直接量法,创建未命名函数,*/
var result = function(x,y){return x+y;};
/*也可以指定函数名*/
var result2 = function fact(x){if(x<1) return 1;else return x*fact(x-1)};
document.write('调用一般的方法:');
print("<hr/>");
print('调用构造函数方法:add1(5,6)');
print(add1(5,6));
print("<hr/>");
print("调用函数直接量法:result(3,4)");
var re =result(3,4);
print(re);
print("调用函数直接量法:result2(3)");
print(result2(3));
print("<hr/>");
print('函数作为数据使用');
/*函数可以作为数据使用*/
function add(x,y){return x+y;}
function subtract(x,y){return x-y;}
function multiply(x,y){return x*y;}
function divide(x,y){return x/y;}
function operate(operator,operand1,operand2)
{
return operator(operand1,operand2);
}
//计算(2+3) + (4*5)
var i = operate(add,operate(add,2,3),operate(multiply,4,5));
print('(2+3) + (4*5)='+i);
print("<hr/>");
//使用函数直接量
var operators = new Object();
operators['add'] = function(x,y){return x+y;}
operators['substract'] = function(x,y){return x-y;}
operators['multiply'] = function(x,y){return x*y;}
operators['divide'] = function(x,y){return x/y;}
operators['pow'] = Math.pow;
function operate2(op_name,operand1,operand2)
{
if(operators[op_name] == null) return "unknown operator";
else return operators[op_name](operand1,operand2);
}
//定义"hello" + "" + "world"
var j = operate2("add","hello",operate2("add"," ","world"));
var k = operate2("pow",10,2);
print(j);
print(k);
print("<hr/>");
</script>
</body>
</html>
运行结果为:
调用一般的方法:
调用构造函数方法:add1(5,6)
11
调用函数直接量法:result(3,4)
7
调用函数直接量法:result2(3)
6
函数作为数据使用
(2+3) + (4*5)=25
hello world
100
在javascript函数体内,标识符arguments代表函数的实际参数,引用Arguments对象。
1.arguments的属性length: 参数列表的实际长度
2.arguments的属性callee:当前正在执行的函数
例子
2 <head>
3 <title></title>
4 </head>
5 <body>
6 <script type="text/javascript">
7 /*打印函数*/
8 function write()
9 {
10 if(arguments.length>0)
11 document.write(arguments[0]);
12 }
13 /*基本属性length*/
14 function arg_test()
15 {
16 var arg = arguments;
17 write("arguments's length="+arguments.length+'<br/>');
18 var i;
19 for(i=0;i<arg.length;i++)
20 {
21 write('arg['+i+'] is '+arg[i]+'<br/>');
22 }
23 }
24 arg_test('hello','world');
25 write("arg_test('hello','world')");
26 write('<hr/>');
27 /*取最大值*/
28 function max()
29 {
30 var m = Number.NEGATIVE_INFINITY;
31 for(var i = 0; i < arguments.length; i++)
32 {
33 if(arguments[i] > m)
34 m = arguments[i];
35 }
36 return m;
37 }
38 write('fun_max(1,2,3,4,5,6,7,8,9,0,105)='+max(1,2,3,4,5,6,7,8,9,0,105)+'<br/>');
39 write('<hr/>');
40 /*基本属性callee*/
41 var result = function(x){
42 if(x<=1) return 1;
43 return x*arguments.callee(x-1); /*用来引用当前正在执行的函数,*/
44 };
45
46 write('fun_递归值:result(3)='+result(3));
47 write('<hr/>');
48
49 </script>
50 </body>
51 </html>
运行结果为:
arguments's length=2
arg[0] is hello
arg[1] is world
arg_test('hello','world')
fun_max(1,2,3,4,5,6,7,8,9,0,105)=105
fun_递归值:result(3)=6
