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方法定义的属性可以被覆载。

原文地址:https://www.cnblogs.com/xuruweb/p/4104405.html