javascript 类

简介: 准备工作: (一)js函数 Js函数基本的定义语法为: function 函数名(arg1,arg2,……) {} 和通常意义上的函数(方法)相似。可以有返回值。 例如: function noReturnValue(){    } function hasReturnVal...

准备工作:

(一)js函数

Js函数基本的定义语法为:

function 函数名(arg1,arg2,……)

{}

和通常意义上的函数(方法)相似。可以有返回值。

例如:

< script >

function  noReturnValue()
{    



function  hasReturnValue()
{
    
return   ' ok ' ;


function  doClick()
{
    alert(noReturnValue());
    alert(hasReturnValue());
}

< / script>

 

函数noReturnValue没有返回值,所以打印结果为:undefined

hasReturnValue返回ok字串。

(二)Function对象

ECMAScript有一类对象为:Function对象。它表示定义的任何函数(function

var function_name = new Function(arg1, arg2, ..., argN, function_body)

 

示例:

function  doClick2()
{
      
var  fun  =   new  
      Function(
" a1 " " alert(a1); " );

      fun(
' ok ' );
}

通过Function定义的函数对象,最后一个参数为函数体,前边的参数。两部分都以字符串类型存在。通过字符串的定义方式来定义较困难,但它指示函数是一种引用类型,函数是Function类型的一个实例,而函数名而是一个指向函数的变量。

(三)函数类型

可以通过typeof来得到js对象的类型。

示例一(类型):

function  doClick3()
{
    
var  fun  =   new  Function( " a1 " " alert(a1); " );
    alert(
" Object: " + typeof  (Object)  +   " \r\n "
    
+   " Date: "   +   typeof  (Date)  +   " \r\n "
    
+   " Array: "   +   typeof  (Array)  +   " \r\n "
    
+   " Function: "   +   typeof  (Function)  +   " \r\n "
    
+   " new Function(): "   +   typeof  ( new  Function())  +   " \r\n "
    
+   " function: "   +   typeof  (fun)  +   " \r\n "
 

    
+   " new Date(): "   +   typeof  ( new  Date())  +   " \r\n "
    
+   " new Array(): "   +   typeof  ( new  Array())  +   " \r\n "
    
+   " new Object(): "   +   typeof  ( new  Object())  +   " \r\n "
    );
}

 

 

对于对象来说它们的类型做为一种函数存在;创建完的对象除Function外,做为对象类型(object)存在。

 

示例二(构造方法):

function  doClick4()
{
    
var  fun  =   new  Function( " a1 " " alert(a1); " );
    alert(fun.constructor); 

    
var  obj  =   new  Array();
    alert(obj.constructor); 

    
var  i  =   0 ;
    alert(i.constructor);
 

    
var  num  =   new  Number();
    alert(num.constructor);
}

 

打印的内容除第一个外都是以function 函数名(){}。那么这些对象都是通过function定义的函数对象。函数对象可以构造对象。

 

而函数对象的构造方法为:

function Function(){

[native code]

}

 

示例三(函数对象构造对象):

function  doClick5()
{
    
var  no  =   new  Number();
    alert(
" 对象类型: "   +   typeof  (no)  +   " \r\n构造方法: "   +  no.constructor); 

    alert(
" 对象类型: "   +   typeof  (hasReturnValue)  +   " \r\n构造方法: "   +  hasReturnValue.constructor);
    
    
var  conobj  =  hasReturnValue();
    alert(
" 对象类型: "   +   typeof  (conobj)  +   " \r\n构造方法: "   +  conobj.constructor); 

    
var  fun  =   new  Function( " a1 " "" );
    
var  mess1  =   new  fun( ' ok ' );
    alert(
typeof  (fun));
    alert(
typeof  (mess1));
    alert(mess1.constructor);
}

 

No是一个对象;hasReturnValue是一个函数对象;fun是一个函数对象。函数对象可以构造对象,所以可以有:

var conobj = hasReturnValue();

var mess1 = new fun('ok');

 

类定义

javac#中,类可以存放数据,其中最基本的类型有属性、方法、域。在js中创建(js)类有相似的功能,它的类强调的是一种复合类型。它允许通过变量名进行读取(例如js函数名可做为变量名使用)。而进行访问时,通过键对值方式进行。在C#中,访问属性其实也是这样的,例如,Customer类有公有的Name属性性,其中Name属性有读写两个属性器。假设Name属性为静态属性,则可以通过Customer.Name来访问,赋值或得到值。从大的方面讲,是一种以KV对方式进行访问。

(一)   以大括号方式定义

例如:

var  customer  =  {};
var  product  =  
{
    name:
' mp3 ' ,
    price:
0
};

function  doClick()
{
    alert(
typeof  (customer));
    alert(
typeof  (product));
    alert(
typeof  (Date));
}

定义了两个js类:customerproduct。通过测试它们的类型(typeof),它们做为一种object类型存在。那么它们不可以通过new方式创建(函数对象可以创建对象,例如Date)。

 

(二)函数对象

示例一(类型):

函数对象可以创建对象,那么可以通过function来模拟类类型。

function  user()
{
    
this .username  =   '' ;
    userage 
=   0 ;


function  doClick2()
{
    alert(
typeof  (user));
    
var  user1  =   new  user();

    user1.username 
=   " 宋江 " ;
    alert(user1.username);
}

 

这里定义了一个user类(函数)

doClick事件(函数)中,可以得到user的类型为function,它可以用于创建对象,并可以访问。在user类中,有两个属性(也可以看做是域),其中username通过this关键字定义,userage是直接定义。创建完user对象后,即user1,可以访问usernameuserage

var user1 = new user();

user1.username = "宋江";

alert(user1.username);

 

示例二(为类添加函数):

function  user()
{
    
this .username  =   '' ;
    userage 
=   0 ;
    
this .showMessage  =   function ()
    {
        alert(
' user类的函数 ' );
    }
}

function  doClick3()
{
    
var  user1  =   new  user();
    user1.showMessage();
}

对于类中的函数来说,有私有和公有访问性。通过var定义的为私有函数,通过this定义的为公有函数。

示例三(属性定义与函数定义):

在通过function定义类类型时,其中的属性(区别类中的函数)可以通过三种修饰符进行,如下:

function  clsProperty()
{
    p1 
=   1 ;
    
var  p2  =   2 ;
    
this .p3  =   3 ;
}

function  doClick4()
{
    
var  cls  =   new  clsProperty(); 

    alert(cls.p1);
    alert(cls.p2);
    alert(cls.p3); 

    cls.p1 
=   1 ;
    cls.p2 
=   2 ;
    cls.p3 
=   3

    alert(cls.p1);
    alert(cls.p2);
    alert(cls.p3); 

    clsProperty.p1 
=   1 ;
    clsProperty.p2 
=   2 ;
    clsProperty.p3 
=   3 ;    

    alert(clsProperty.p1);
    alert(clsProperty.p2);
    alert(clsProperty.p3);
}

 

三种修饰中在添加this关键字时,具有良好的访问支持,但无修饰或var修饰时,不可以进行操作。Var是用于定义局部变量的关键字。在定义属性时,可以把它理解为私有访问修饰符,而this则可以理解为公有访问修饰符。

function  clsProperty1()
{
    p1 
=   function () { alert( ' p1 ' ); };
    
var  p2  =   function () { alert( ' p2 ' ); };
    
this .p3  =   function () { alert( ' p3 ' ); };
}

function  doClick5()
{
    
var  cls  =   new  clsProperty1(); 

    cls.p1();
    cls.p2();
    cls.p3(); 

    clsProperty1.p1();
    clsProperty1.p2();
    clsProperty1.p3();
}

 

P1为无修饰符,p2var修改符,p3this修饰符。在doClick5中,cls.p3()clsProperty1.p2()可以访问。所以,对于js类中的函数来讲:

Var修饰符类似C#中的静态方法(函数)修饰符;this类似实例方法(函数)修饰符。

所以对于js类中的属性来讲,也可以把varthis修饰符做为相似的比较:

Var修饰符用于私有属性修饰符;this类似公有属性修饰符。

 

 

(三)js类中的静态实现

function  user()
{
}

user.age 
=   30 ;
user.showAge 
=   function () { alert(user.age); } 

function  doClick()
{
    user.showAge();
    user.age 
=   20 ;
    user.showAge();
}

通过在类外进行设置,可以用于静态访问。

 

(四)js类中的实例实现

在上一篇中,通过this关键字实现实例属性和实例方法(函数)。还有一种通过prototype关键字实现。

function  user()
{
}

user.age 
=   30 ;
user.showAge 
=   function () { alert(user.age); }
 

user.prototype.showMessage 
=   function ()
{
    alert(
' 实例方法 ' );
}

function  doClick1()
{
    
var  user1  =   new  user();
    user1.showMessage();    
}

 

(五)构造方法

以上的例子中,创建类,构造方法都是无参数的。

function  user()
{

}

下边是个带参数的:

function  product(id, name, price)
{
    
this .id  =  id;
    
this .name  =  name;
    
this .price  =  price;
}

在调用进,分为两种情况:

情况一:正好符合参数个数,正常调用;情况二:少参数,则从左到右匹配,没有匹配的为未定义;情况三:多参数,按正常匹配。

function  product(id, name, price)
{
    
this .id  =  id;
    
this .name  =  name;
    
this .price  =  price;
    
this .getString  =   function ()
    {
        
return ( " id: " + this .id + "  name: " + this .name + "  price: " + this .price);
    }
}


function  doClick2()
{
    
var  pro1  =   new  product( 1 , ' mp3 ' , 100 );
    alert(pro1.getString()); 

    
var  pro2  =   new  product();
    alert(pro2.getString()); 

    
var  pro3  =   new  product( 1 );
    alert(pro3.getString()); 

    
var  pro4  =   new  product( 1 ' mp3 ' );
    alert(pro4.getString());
}

 

博客园大道至简

http://www.cnblogs.com/jams742003/

转载请注明:博客园

目录
相关文章
|
1月前
|
JavaScript 前端开发
如何在 JavaScript 中实现继承?
如何在 JavaScript 中实现继承?
11 2
|
1月前
|
JavaScript 前端开发
探索JavaScript中的构造函数,巩固你的JavaScript基础
探索JavaScript中的构造函数,巩固你的JavaScript基础
|
11月前
|
JavaScript 前端开发 开发者
JavaScript专题-继承
avaScript专题-继承 此专题系列将对JavaScript重难点进行梳理,希望能融会贯通,加深印象,更进一步... 本章需要你比较熟悉原型链相关的知识,如果你还不熟悉或者略有忘记,可以看看我的往期文章(JavaScript专题-原型链
42 0
|
JavaScript 前端开发
|
设计模式 JavaScript 前端开发
JavaScript中的类
JavaScript中的类
|
JavaScript 前端开发
【JavaScript】setlntval函数和内置类..
​ 目录 去除前后空白trim 复选框的全选和取消全选  获取系统当前时间  周期函数setInterval  内置支持类Array
104 0
|
JavaScript 前端开发
Javascript getElementsByName()方法
Javascript getElementsByName()方法
76 0
Javascript getElementsByName()方法
|
JavaScript 前端开发
JavaScript 中的 6 种继承
JavaScript 中的 6 种继承
|
JavaScript 小程序 前端开发
JavaScript中的类有什么问题呢?
并不是说 JS 的类有问题,但是如果你使用该语言已有一段时间,特别是使用过ES5,那么你可能就知道了从原型继承到当前类模型的演变。
175 0
JavaScript中的类有什么问题呢?
|
JavaScript 前端开发
JavaScript的继承 -转载
JavaScript继承 概况 在《Object Oriented JavaScript》提及了12种javascript的继承方式的变化(12种,感觉有点多吧). JavaScript中并没有类,function在JavaScript中的作用只是作为一个构造函数,不过我们后面都暂且把构造函数叫做类。
817 0