javascript基础---面向对象
1.类的创建方法
构造器创建类
用构造器创建类 实际上是用函数实现的。
形式:function 类名(){
定义属性的方法 this.age=age;
定义方法的方法:this.methed=function (){}
}
(2)使用prototype属性定义属性和方法,prototype属性是定义类时自动生成的。类名.prototype={},prototype属性可以为类添加成员。
注意:没有返回值,类名首字母最好要大写,可以带参数
可以通过 类名.constructor获取类的构造器。这个只可以是对自定义类,而对于宿主类是不可以的,因为宿主类的业务逻辑被隐藏啦,返回的是宿主对象。
2.类创建实例
(1)通过new 创建类,然后类中的属性和方法可以通过.号和[]来获得。
(2)object类的实例可以通过 object obj={}来定义,其中的属性和方法可以定义时赋值,如 object obj={radius :3;area:5;}
Array 类同样可以 Array array=[],同样可以定义时赋值。
3.this关键字
定义类的方法和属性,如果是直接定义 是私有变量仅能在类中使用
注意:(1)闭包方法中的this关键字,闭包中的this 不能确保this关键字总是引用在其中定义了方法的类和对象。
eg:
function warp(){ function HelloWorld(){ var temp='abc'; this.B=function(){ return this.A; } this.A=function(){ document.write("temp的本地变量是"+temp); document.write(this+"<br>"); } } var myhello=new HelloWorld(); var t=myhello.B() t(); document.write(this); }
输出的是本地变量,和window,window。我的理解是:t()调用的时候,可以写成window.t() 所以t()中的this引用都是指向window的
(2)对于在函数中嵌套另外一个函数,其中 的this都是表示全局对象window.如果想拥有当前的变量,要在外函数上加中间变量,内部函数用中间变量而不是用this。因为this的值在不断的变化。
eg:
function Foo(){ Foo.prototype.method=function(){ var that=this; function test=function(){ alert(that) } test(); } } var foo=new Foo(); foo.method();
(3)使用new创建实例,和直接调用构造函数
用new创造实例,时this是指向类的,
如果是用构造函数直接调用的话,this关键字就不会代表该类的实例,是指向全局对象window。
4.成员访问控制
公有成员:用this和prototype两种方式定义的方法和属性都是公共属性和方法。this.t=a;可以在类中访问,也可以在实例和之类中访问。
私有成员:是普通定义的 如:var t=a; 私有成员表示这个成员只能在类中被访问,不能在实例和继承之类中被访问。被访问的方式也是直接调用,不能使用this调用。
function Foo() { this.age;//公有属性 this.eat=function(){}//公有方法 var height();//私有属性 var like=function(){}//私有方法 function likepeople(){}//私有方法 }
5.继承--原型链继承,使用原型达到继承的效果
(1) 方式:function people(){}
function man(){}
man.prototype=new people //man的prototype 属性实现继承,继承了people实例中的方法和属性。
(2)之类要传参数给自己。
function man(a,b){
this.age=a;
this.heigh=b;
}
man.prototype=new people //man的prototype 属性实现继承,继承了people实例中的方法和属性。
(3)之类传参数给父类
function man(a,b){
this.$super=people;
this.$super(a,b);
}
man.prototype=new people //man的prototype 属性实现继承,继承了people实例中的方法和属性。
6.静态成员定义和调用
(1)什么时候用静态成员:成员是属于类的,不会生成一个实例就生成一个变量。
(2)定义方式:
function Foo(){}
Foo.age=10;
Foo.method=function(){}
(3)如何调用
调用属性:用类名.属性名、
调用方法:类名.方式名
eg:Foo.age=20; Foo.method();
(4)注意:类方法中不能使用this,因此不能使用非静态成员,只能使用静态成员。
可以定义同名的静态成员和非静态成员。因为他们访问方式和存储方式不同。
当一个类中的所有属性和方式都是静态的时候,这个类就是静态类。
7.重载和覆盖(静态方法和属性是不可以被继承和重载的)
(1)javascript中的重载和C++中的重载有区别,因为在javascript中不允许出现相同名称的方法;重载的方法是通过在函数中根据arguments的length和typeof运算符进行判断当前函数调用时的参数个数和参数类型
function overLoad(){} overLoad.prototype.method=function(){ var len=arguements.length; if(len==2) { 执行代码 } if(len==3) { if(typeof (arguements[0])=='Number'&&typeof (arguements[1])=='Number') { 执行代码 } } }
(2)重写(一般情况下无需覆载属性)
方法覆载的方式:为之类新定义一个同名的成员方法,就能实现类中方法的覆载。
属性覆载的方式:基类中用this 和prototype定义的属性不可以被覆载,而用set get方法定义的属性可以被覆载。