javascript 面向对象编程 function也是类

但javascript中并没有类概念,所谓的类也是模拟而来,通过函数加闭包模拟出类成员及私有成员(关于闭包可以参见跨越边界: 闭包)。这里我们将用比较平实的方式来了解一下javascript中的”类”,避开一些生硬的原理。

既然是用function来模拟类,所以编写代码创建类的关键字还是function。我们创建一个座标点类。

function Point() { this.X = 0; this.Y = 0; };  var zeroPoint = new Point(); alert("当前座标值( X:" + zeroPoint.X + " , Y:" + zeroPoint.Y + " )");

image

大家都知道非静态类成员的访问需要通过对象来完成,所以先new出了一个Point类型对象,再通过该对象完成X和Y轴座标值的访问。从语法上来说,javascript类对象的创建过程和C#等差不多,但实现机制却不相同。这里的new创建出了一个Object,后续的Point()函数执行时将其this指向了这个新的Object对象。Point中的this.X和this.Y是Point类的两个公共成员,所以Point的对象可以直接对它们进行访问。

说到类成员或对象的成员,免不了要提到可访问性的问题。在javascript的类中,也有public成员和private成员之分,但究其细节却不尽相同。javascript私有成员也是些在类外部不可以通过对象进行操作的成员,其实在类的内部成员之间私有成员也不定能被访问。在类的内部一般只有私有成员和私有成员之间可以互相的访问,你可以认为其它成员权限不够不能操作这些隐私的东西,但如果你有特权,那就不一样了,管它私有公开照用不误。私有成员变量和普通变量声明一样,用var关键字,私有方法可以用var声明变量来接收方法对象,也可以像普通方法那样去构建。

function Lady() { var age = 30; var name = "菜花"var think = function() { alert("其实我今年" + age + "岁。"); }; function fancy(){ alert("幻想变成20岁。"); };  this.Introduce = function() { alert("我叫" + name + " , 今年20岁。"); }; };  var younglady = new Lady(); alert(younglady.age);//结果undefined younglady.think(); //不支持 younglady.fancy(); //不支持

上面是一个Lady类,age、think、fancy都是私有成员,think和fancy方法可以访问age和name,think和fancy两个方法也可以互相进行调用。但它们是私有的,所以创建出来的youngLady对象并不能调用到age、think和fancy,当然也不能调用到name。如果私有成员只能互相之间调用,其实也就失去了私有成员存在的意义。javascript提供特权成员可以建立外界和私有成员互通的桥梁。特权成员是公共成员的一种,公共成员有普通公共成员、特权成员和对象公共成员。

特权成员就是在类中用this.XX的方式建立的成员,它们可以通过对象来被调用,它们也可以访问私有成员,可以建立私有成员被访问的通道。

function Lady() { var age = 30; this.Name = "菜花"var think = function() { alert("其实我今年" + age + "岁。"); };  function fancy() { alert("幻想变成20岁。"); };  this.Introduce = function() { alert("我叫" + this.Name + " , 今年" + age + "岁。"); }; };  var younglady = new Lady(); younglady.Introduce(); //Introduce

image

普通公共成员的创建,不在类的里面来编码,而是通过类的prototype来创建。添加普通公共成员都直接添加到类的prototype中,而prototype就是一个像JSON对象一样的成员集对象。当我们进行对象创建时,可以认为会将类prototype中的成员整体copy入新的Object对象中。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wjyjpx.html