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(""+person_1.constructor+"
");
#说明一下
pre 元素可定义预格式化的文本。被包围在 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/