类和实例

2020-08-21  本文已影响0人  江平路

类的特征

  1. 公有方法
  2. 私有方法
  3. 属性
  4. 私有变量
  5. 析构函数:(析构函数与构造函数相反,当对象结束其生命周期,如对象所在的函数已调用完毕时,系统自动执行析构函数。析构函数往往用来做“清理善后” 的工作,例如在建立对象时用new开辟了一片内存空间,delete会自动调用析构函数后释放内存)
/***定义类***/
var Class = function(){
  var _self = this;//把本身引用负值到一变量上
  var _Field = "Test Field"; //私有字段
  var privateMethod = function(){ //私有方法
    alert(_self.Property); //调用属性
  }
  this.Property = "Test Property"; //公有属性
  this.Method = function(){ //公有方法
    alert(_Field); //调用私用字段
    privateMethod(); //调用私用方法
  }
 /***析构函数***/
  var init = function(){
    privateMethod();
  }
  init();
}

Javascript本身并不支持面向对象,它没有访问控制符,它没有定义类的关键字class,它没有支持继承的extend或冒号,它也没有用来支持虚函数的virtual,不过,Javascript是一门灵活的语言,下面我们就看看没有关键字class的Javascript如何实现类定义,并创建对象。

一、定义类并创建类的实例对象

在Javascript中,我们用function来定义类,如下:

function Shape()
{
var x=1;//私有变量
}

然后,我们可以创建Shape类的对象aShape(实例化Shape类),如下:

var aShape = new Shape();

二、定义公有属性和私有属性

function Shape()
{
var x=1;//私有属性,无法通过aShape.x获取
this.y=2;//公有属性,可通过aShape.y获取
}

用var可以定义类的private属性,而用this能定义类的public属性。

三、定义公有方法和私有方法

function Shape()
{
var x=0;
var y=1;
this.draw=function(){};//公有方法
var draw = function(){}//私有方法
}

四、构造函数

javascript并不支持OOP,当然也就没有构造函数了,不过,我们可以自己模拟一个构造函数,让对象被创建时自动调用,代码如下:

function Shape()
{
var init = function()
{
//构造函数代码
};
init();
}

在Shape的最后,我们人为的调用了init函数,那么,在创建了一个Shape对象是,init总会被自动调用,可以模拟我们的构造函数了。

五、带参数的构造函数

function Shape(ax,ay)
{
var x=0;
var y=0;
var init = function()
{
//构造函数
x=ax;
y=ay;
};
init();
}

var aShape = new Shape(0,1);

六、静态属性和静态方法

function Shape(ax,ay)
{
var x=0;
var y=0;
var init = function()
{
//构造函数
x=ax;
y=ay;
};
init();
}
Shape.count=0;//定义一个静态属性count,这个属性是属于类的,不是属于对象的。
Shape.staticMethod=function(){};//定义一个静态的方法

有了静态属性和方法,我们就可以用类名来访问它了,如下

alert ( aShape.count );
aShape.staticMethod();

七、在方法中访问本类的公有属性和私有属性

function Shape(ax,ay)
{
  var x=0;
  var y=0;
  this.gx=0;
  this.gy=0;
  var init = function()
{
x=ax;//访问私有属性,直接写变量名即可
y=ay;
this.gx=ax;//访问公有属性,需要在变量名前加上this.
this.gy=ay;
};
init();
}

八、this的注意事项

类中的this并不是一直指向我们的这个对象本身的,主要原因还是因为Javascript并不是OOP语言,而且,函数和类均用function定义,当然会引起一些小问题。

this指针指错的场合一般在事件处理上面,我们想让某个对象的成员函数来响应某个事件,当事件被触发以后,系统会调用我们这个成员函数,但是,传入的this指针已经不是我们本身的对象了,当然,这时再在成员函数中调用this当然会出错了。

解决方法是我们在定义类的一开始就将this保存到一个私有的属性中,以后,我们可以用这个属性代替this。我用这个方法使用this指针相当安全,而且很是省心~

我们修改一下代码,解决this问题。

function Shape(ax,ay)
{
var _this=this; //把this保存下来,以后用_this代替this,这样就不会被this弄晕了
var x=0;
var y=0;
_this.gx=0;
_this.gy=0;
var init = function()
{
x=ax;//访问私有属性,直接写变量名即可
y=ay;
_this.gx=ax;//访问公有属性,需要在变量名前加上this.
_this.gy=ay;
};
init();
}

九、实例与对象的区别

var person = new Object();
var person = {};

JS 是基于原型的面向对象语言, 所有数据都可以当作对象处理,所以 person 是对象, 可以把它当作是 Object 的实例.。当然在js中, 一切都是对象。

第二个采用对象字面量的方式生成的person也是如此。

然而它内部没有调用new Object(),而是采用JSON的初始化方式:将现有的引用指向person。

实例和对象的区别,从定义上来讲:
1、实例是类的具象化产品,
2、而对象是一个具有多种属性的内容结构。
实例都是对象,而对象不全是实例。

Js里面没有类(ES6以前)的语法,所以类的概念就通过创造一个对象来实现。

对于function函数:
函数实际上就是对象,每个函数都是Function类型的实例,由于函数是对象,因此函数名也是指向函数对象的一个指针,并不会和函数绑定.

上一篇 下一篇

猜你喜欢

热点阅读