javascript 权威指南解读

1.变量的传值和传址
var myArray=["tom","disk"];
var newArray=myArray;
alert(newArray[1]);//返回disk
myArray[1]="jack";
alert(newArray[1]);//返回jack
//同样的
newArray[1]="apple";
alert(myArray[1]);//返回apple
//可参照堆的使用规则

2.字符串的堆栈使用问题

var str1=new String("abc");
var str2="abc";
//前者使用new新建String对象,对象存放于堆中,每调用一次就会创建一个新的对象;而第二种是在栈中,栈中存放值“abc”和对值的引用
alert(str1==str2)//true
alert(str1===str2)//false
//str1和str2的数据类型不同,推荐第二种方式,有利于节省空间,并且栈的访问更快

3.强制数据类型转换

parseFloat();  parseInt();  Number();  String();  Boolean();

parseInt("3.5");//返回3

4. 获取构造器方法

ver person_1=new Person();

document.write("<pre>"+person_1.constructor+"</pre>");

#说明一下

pre 元素可定义预格式化的文本。被包围在 pre 元素中的文本通常会保留空格和换行符。而文本也会呈现为等宽字体。

<pre> 标签的一个常见应用就是用来表示计算机的源代码。

可以导致段落断开的标签(例如标题、<p> 和 <address> 标签)绝不能包含在 <pre> 所定义的块里。尽管有些浏览器会把段落结束标签解释为简单地换行,但是这种行为在所有浏览器上并不都是一样的。

5. 有几种类不需要new关键字就可以实例化(当然也可以使用):

Object:var newObject={nickName: "John", projects: ["Flash","Dreamweaver"]};

Array:var radius=5; var myArray =[radius, Math.PI*radius*radius];

6. 访问对象属性

如果属性初始状态没有赋值,那么该属性就没有初始值,在这种情况下,一般在创建实例后为属性赋初始值。

function Person(){
  this.age;
  this.nickName;
  this.showInfo=function(){
  return("嗨!我的名字是"+this.nickName+",我现在"+this.age+"岁了。");
  }
}
var tom=new Person();
tom.nickName="Tom";

也可以使用方括号来访问属性和为属性赋值,不推荐使用这种方式,但是动态属性一般都必须使用这种方式来访问。 

var myName=tom["nickName"];

tom["nickName"]="John";

7.使用this关键字定义方法和属性

属性是类中声明的变量,与其他地方变量的声明基本相同,只是属性必须属于this关键字,并且这里没有使用var 关键字。

8.使用prototype定义方法和属性

function Person(){}
Person.prototype.nickName=null;
person.prototype.age=null;
Person.prototype.showInfo=function(){
  return("嗨!我的名字是"+this.nickName+",我现在"+this.age+"岁了。");
  }
//添加新成员
function showHistory(){
  return "10年开发经验";
}
Person.prototype.showHistory=showHistory;

特别注意的是,每个构造器方法都有一个prototype属性,而类的每个实例也都有一个_proto_属性(IE不支持使用),用于引用创建它的构造器方法的prototype属性。 

 9.使用prototype和Object配合为类定义方法和属性

function Person(){}
Person.prototype={
nickName:"John",//注意符号
age:15,
showInfo:function(){
  return("嗨!我的名字是"+this.nickName+",我现在"+this.age+"岁了。");
  }
};

10. 类的继承,创建子类

function Person(myName, myAge){
  this.age=myAge;
  this.nickName=myName;
  this.showInfo=function(){
  return("嗨!我的名字是"+this.nickName+",我现在"+this.age+"岁了。");
  }
}
function Child(){}
Child.prototype=new Person();
//使用子类
var child_1=new Child();


11.使用基类的构造器方法

注意上例中对Child类定义没有使用带参数的构造器方法,即使使用了带参数的构造器也无法将参数传递给基类(Person类),要想不在Child类重新定义属性而实现向基类构造器的方法传递参数,很多开发语言定义了super()方法,但javascript没有定义super方法,所以可以使用下面的方法实现这样的功能:

function Child(myName, myAge){
   //首先获得基类的构造器,将它作为当前类的一个属性
    this.$super=Person;//不能直接使用super,因为它是一个保留的关键字
   //然后调用基类的构造器
   this.$super(myName, myAge);
}
Child.prototype=new Person();
var child_1=new Child("Jane", 8);
document.write(child_1.showInfo());

检测一个子类是否继承于某个基类:

document.write(Child.prototype.constructor==Person);

12. 扩建内建javascript类

String.prototype.ltrim=function(){
            return this.replace(/^(\s*|  *)/,"");
};
String.prototype.rtrim=function(){
          return this.replace(/(\s*|  *)$/,"");
};
if(!String.prototype.trim){
String.prototype.trim=function(){
    var t=this.rtrim(); 
     return t.ltrim();           
};
}

13. 类的组合

 function Window(){
   this.open=function(){...}
   this.close=function(){...}
}

 function Door(){
   this.open=function(){...}
   this.close=function(){...}
}

function House(){
   this.openWindow=function(){
   var window =new Window();
   window.open();
   }   

   this.closeWindow=function(){
   var window =new Window();
   window.close();
   }

   this.openDoor=function(){
   var door=new Door();
   door.open();
   }   

   this.closeWindow=function(){
   var door=new Door();
   door.close();
   }
}

14. 匿名函数

在Javascript定义一个函数一般有如下三种方式:

函数关键字(function)语句:

function fnMethodName(x){alert(x);}

函数字面量(Function Literals):

var fnMethodName = function(x){alert(x);}

Function()构造函数:

 var fnMethodName = new Function('x','alert(x);')

上面三种方法定义了同一个方法函数fnMethodName,第1种就是最常用的方法,后两种都是把一个函数复制给变量fnMethodName,而这个函数是没有名字的,即匿名函数。实际上,相当多的语言都有匿名函数。

函数字面量和Function()构造函数的区别:

虽然函数字面量是一个匿名函数,但语法允许为其指定任意一个函数名,当写递归函数时可以调用它自己,使用Function()构造函数则不行。

 var f = function fact(x) {
  if (x < = 1) return 1;
  else return x*fact(x-1);
 };

Function()构造函数允许运行时Javascript代码动态的创建和编译。在这个方式上它类似全局函数eval()。

Function()构造函数每次执行时都解析函数主体,并创建一个新的函数对象。所以当在一个循环或者频繁执行的函数中调用Function()构造函数的效率是非常低的。相反,函数字面量却不是每次遇到都重新编译的。

用Function()构造函数创建一个函数时并不遵循典型的作用域,它一直把它当作是顶级函数来执行。

var y = "global";
function constructFunction() {
    var y = "local";
    return new Function("return y");  //  无法获取局部变量
}
alert(constructFunction()());  // 输出 "global"

和函数关键字定义相比Function()构造器有自己的特点且要难以使用的多,所以这项技术通常很少使用。而函数字面量表达式和函数关键字定义非常接近。考虑前面的区别,虽然有消息说字面量的匿名函数在OS X 10.4.3下的某些webkit的引擎下有bug,但我们平常所说的匿名函数均指采用函数字面量形式的匿名函数。更多详细内容可以阅读《JavaScript: The Definitive Guide, 5th Edition》的Functions那章。

匿名函数的代码模式:

错误模式:其无法工作,浏览器会报语法错。

function(){
  alert(1);
}();

(1)函数字面量:首先声明一个函数对象,然后执行它。

(function(){
  alert(1);
})();

(2)优先表达式:由于Javascript执行表达式是从圆括号里面到外面,所以可以用圆括号强制执行声明的函数。

(function(){
  alert(2);
}());

(3)Void操作符:用void操作符去执行一个没有用圆括号包围的一个单独操作数。

void function(){
  alert(3);
}()

这三种方式是等同的,在实际应用中看到的和使用的都是第1种。

http://dancewithnet.com/2008/05/07/javascript-anonymous-function/

 

 


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值