创建对象
首先我们理解一下面向对象编程(Object-Oriented Programming,OOP),使用OOP技术,常常要使用许多 代码模块,每个模块都提供特定的功能,每个模块都是孤立的,甚至与其它模块完全独立 。这种模块化编程方法提供了非常大的多样性,大大增加了代码的重用机会。可以举例进一步说明这个问 题,假定计算机上的一个高性能应用程序是一辆一流赛车。如果使用传统的编程技巧,这辆赛车就是 一个单元。如果要改进该车,就必须替换整个单元,把它送回厂商,让汽车专家升级它,或者购买一个新 车。如果使用OOP技术,就只需从厂商处购买新的引擎,自己按照说明替换它,而不必用钢锯切割车体。 不过大部分的论点是,javascript并不是直接的面向对象的语言,但是通过模拟可以做到很多面向对象语 言才能做到的事,如继承,多态,封装,javascript都能干(没有做不到,只是想不到)
//以下三种构造对象的方法 //new Object,实例化一个Object var a=new Object(); a.x=1,a.y=2; //对象直接量 var b={x:1,y:2}; //定义类型 function Point(x,y){ //类似于C#中的类 this.x=x; this.y=y; } var p=new Point(1,2); //实例化类
第一种方法通过构造基本对象直接添加属性的方法来实现,第二种和第一种差不多,可以看成是第一种方法的快捷表示法 第三种方法中,可以以”类“为基础,创造多个类型相同的对象
对象属性的封装(公有和私有)
以例子来说明
function List(){
var m_elements=[]; //私有成员,在对象外无法访问,如果此处无var声明,则m_elements将变成全局变 量,这样外部是可以直接访问到的,如alert(m_elements[0])
m_elements=Array.apply(m_elements,arguments); //此处模拟getter,使用时alist.length; //等价于getName()方式:this.length=function(){return m_elements.length;},使用时 alist.length(); //公有属性,可以通过"."运算符或下标来访问 this.length={ valueOf:function(){ return m_elements.length; }, toString:function(){ return m_elements.length; } } //公有方法,此方法使用得alert(alist)相当于alert(alist.toString()) this.toString=function(){ return m_elements.toString(); } //公有方法 this.add=function(){ m_elements.push.apply(m_elements,arguments); } //私有方法如下形式,这里涉及到了闭包的概念,接下来继续说明 //var add=function()或function add() //{ //m_elements.push.apply(m_elements,arguments); //} } var alist=new List(1,2,3); dwn(alist); //=alert(alist.toString()),输出1,2,3 dwn(alist.length); //输出3 alist.add(4,5,6); dwn(alist); //输出1,2,3,4,5,6 dwn(alist.length); //输出6
属性和方法的类型
javascript里,对象的属性和方法支持4种不同的类型:private property(私有属性),dynamic publicproperty(动态公有属性),static public property/prototype property(静态公有属性或原型属性), static property(静态属性或类属性)。私有属性对外界完全不具备访问性,可以通过内部的getter和setter(都是模拟);动态公有属性外界可以访问,每个对象实例持有一个副本,不会相互影响;原型 属性每个对象实例共享唯一副本;类属性不作为实例的属性,只作为类的属性。
以下是例子:
//动态公有类型,静态公有类型(原型属性) function myClass(){ var p=100; //private property this.x=10; //dynamic public property } myClass.prototype.y=20; //static public property or prototype property,动态为myClass的原型添 加了属性,将作用于所有实例化了的对象,注意这里用到了prototype,这是一个非常有用的东东 //要想成为高级javascript阶段,prototype和闭包必须得理解和适当应用 myClass.z=30; //static property var a=new myClass(); dwn(a.p) //undefined dwn(a.x) //10 dwn(a.y) //20 a.x=20; a.y=40; dwn(a.x); //20 dwn(a.y); //40 delete(a.x); //删除对象a的属性x delete(a.y); //删除对象a的属性y dwn(a.x); //undefined dwn(a.y); //20 静态公有属性y被删除后还原为原型属性y dwn(a.z); //undefined 类属性无法通过对象访问 dwn(myClass.z);
Atas ialah kandungan terperinci javascript创建对象、函数封装、属性代码实例详解. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!