当前位置:文档之家› JAVASCRIPT面向对象基础总结

JAVASCRIPT面向对象基础总结

javascript面向对象基础
1.使用[]调用对象的属性和方法
functionUser()
{
this.age=21;
this.sex="男?";
}
varuser=newUser();
alert(user["age"]);
2.动态添加,修改,删除对象的属性和方法//定义类varuser=newObject(); //添加属性和方法
="cary";
user.age=21;
user.show=function(){
alert(+"年?龄?为?:?"+this.age);}
//执行方法
user.show();
//修改属性和方法
="James";
user.show=function()
{
alert(+"你?好?");
}
//执行方法
user.show();
//删除属性和方法
="undefined";
user.show="undefined"
//执行方法
user.show();
3.使用大括号{}语法创建无类型对象varobj={};
varuser=
{
name:"cary",
age:21,
show:function(){
alert(+"年?龄?为?:?"+this.age);
}
}
user.show();
varobj={};等价于
varobj=newObject();
4.Prototype原型对象
每个函数function也是一个对象,对应的类类型为“Function”,每个函数对象都有一个子对象prototype,表示函数的原型,所以当我们new一个类的对象的时候prototype对象的成员都会被实例化为对象的成员。

例如:
functionclass1()
{}
class1.prototype.show=function(){
alert("prototyemember");
}
varobj=newclass1();
obj.show();
5.Function函数对象详解
5.1Function和Date,Array,String等一样都属于JavaScript的内部对象,这些对象的构造器是由JavaScript本身所定义的。

上面说过函数对象对应的类型是Function,这个和数组的对象是Array一个道理。

所以也可以像newArray()一样newFunction()来创建一个函数对象,而函数对象除了使用这种方式还可以使用function关键字来创建。

我们之所以不经常使用newFunction()的方式来创建函数是因为一个函数一般会有很多语句,如果我们将这些都传到newFunction()的参数中会显得可读性比较差。

varfunctionName=newFunction(p1,p2,...,pn,body)其中p1到pn为参数,body为函数体。

5.2有名函数和无名函数
有名函数:functionfuncName(){}无名函数:varfuncName=function(){}他们之间的唯一区别:就是对于有名函数他可以出现在调用之后再定义,而对于无名函数,他必须是在调用之前就已经定义好。

5.3我们可以利用Function的prototype对象来扩展函数对象,如:
Function.prototype.show=function(){
alert("扩展方法");
}
functionfun()
{}
fun.show();
fun.show().show();
fun.show().show();这句的意思是调用fun.show()这个函数对象的show方法。

是一个递归的调用,因为fun.show()也是一个函数。

5.4
6.传递给参数的隐含参数arguments
我们在使用函数时除了传递制定的参数,还创建了一个隐含的参数arguments,如下:functionfun(a,b){
for(vari=0;i<arguments.length;i++){
alert(arguments[i]);
}
}
fun(1,2,3);
arguments还有一个属性是callee,表示对函数对象本身的引用。

7.函数的apply,call方法
他们的作用都是将函数绑定到另外一个对象上去运行,两者只是在定义参数上有区别,如下:
Function.prototype.apply(thisArg,argArray);
Function.prototype.call(thisArg[,arg1[,arg2...]]);
下面是例子,obj1的show1方法绑定到obj2后整个函数的执行环境就转移到了obj2,所以this指针也就指向了obj2,所以会显示fun2t:
functionfun1(){
="fun1";
this.show1=function(arg){
alert(+arg);
}
}
functionfun2(){
="fun2";
this.show2=function(arg){
alert(+arg);
}
}
varobj1=newfun1();
varobj2=newfun2();
obj1.show1.apply(obj2,["t"]);
obj1.show1.call(obj2,"t");
8.JavaScript中的类实现
8.1命名空间:我们可以使用如下方式实现命名空间,namespace1可以看做为命名
空间。

varnamespace1=newObject();
namespace1.class1=function(){
//对?象初始化代码
}
varobj1=newnamespace1.class1();
8.2类成员
上面的我们已经为类添加了成员和方法,除了上面的方法我们还可以使用prototype的方式来给类添加成员,我们怎么做才是最合理的呢,首先来看下前面的方式:functionUser(){
//构造函数
}
//成员定义
="cary";
User.prototype.show=function(){
alert();
}
上面的方式我们每定义一个类成员都要去写User.prototype,我们可以重构为下面的形式:
functionUser(){
//构造函数
}
//成员定义
User.prototype=
{
name:"cary",
show=function()
{
alert();
}
}
8.3私有成员
实现类的私有成员主要是利用变量的作用域,我们在构造函数中实现。

functionUser(){
//构造函数中定义私有成员
varname="cary";
functionshow()
{
alert(name);
}
//共有成员
this.setname=function()
{
name="james";
}
}
8.4静态成员
我们可以通过给一个函数对象直接添加成员来实现静态成员,如:functionclass1()
{}
//静态属性和方法
class1.staticpr="staticpr";
class1.staticmet=function()
{}
//调用
class1.staticmet();
我们可以通过给函数对象所在的类Function添加成员来实现给所有的函数对象默认添加静态成员,如下:
Function.prototype.staticmet=function()
{}
functionclass1()
{}
//调用
class1.staticmet();
9.实现反射机制
使用for(...in...)方式,for中的varp来存储User对象的属性和方法,我们来判断是属性还是方法,如下:
functionUser(){
//构造函数
}
//成员定义
User.prototype=
{
name:"cary",
show:function()
{
alert(+"Hello");}
}
varu=newUser();
for(varpinu){
if(typeof(u[p])=="function"){
u[p]();
}
else{
alert(u[p]);
}
}。

相关主题