精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Javascript面向對象基礎以及接口和繼承類的實現

開發 前端
本文主要講述一些Javascript面向對象的基礎以及接口和繼承類的實現。作者結合Javascript來設計前臺方面的“設計模式”,以對后臺“設計模式”做個補充。

在開始設計模式的書寫之前,有必要對Javascript面向對象的概念先做個介紹,那么這篇文章就以面向對象基礎作為起點吧。

理論知識

1. 首先Javascript是弱類型語言,它定義變量時不必聲明類型,如var Person = new Person(),它的變量類型為“var”,現在的C# 3.0也引進了這種匿名類型的概念,弱類型的變量產生了極大的靈活性,因為Javascript會根據需要來進行類型轉換。所以這也決定了它采用了晚綁定的方法,即在運行后才知道變量的類型;

2. 面向對象概念不必多說,封裝,繼承,多態;

3. Javascript對象的類型主要分為三種:本地對象,如String,Array,Date等;內置對象,如Global,Math等;宿主對象,是指傳統面向對象程序設計中的作用域,如公有,保護,私有,靜態等等。

主要內容

1. 現在讓我們來看看Javascript怎樣創建對象的:

function Man() {
   //  
}
Man.prototype.getNickName = function() {
    return "Leepy";
}; 

var man = new Man();
var name = man.getNickName(); 

這樣就創建了最簡單的類和對象,其中我們可以把function Man() {} 看作是Man類的構造函數,getNickName()看作是Man類的方法,準確說可以“當作”是Man類的公共方法;為什么要說是當作呢?那是因為其實Javascript實際上并沒有一個私有共有的劃分,因此開發者們自己指定了這樣的規約,那么規約是什么樣的呢?我這里把Man類的清單完整地列出來:

function Man() {
    // 私有靜態屬性
    var Sex = "男";
    //私有靜態方法
    function checkSex() {
        return (Sex == "男");
    }
    //私有方法
    this._getSex = function() {
        //調用私有靜態方法
        if(checkSex())
            return "男";
        else
            return "女";
    }
    //私有方法
    this.getFirstName = function() { 
        return "Li";
    };
    //私有方法
    this.getLastName = function() {
        return "Ping";
    };
}
//公共方法
Man.prototype.getNickName = function() {
    return "Leepy";
};
//公共方法
Man.prototype.getFullName = function() {
    return this.getFirstName() + " " + this.getLastName();
};
//公共方法
Man.prototype.getSex = function() {
    //調用私有方法
    return this._getSex();
};
//公共靜態方法
Man.say = function() {
    return "Happy new year!";
}

這樣的類是否看起來和傳統的類很相似了呢?

2.接下來這個是本篇的一個重點,就是用Javascript如何設計一個接口,然后讓類繼承于它。

首先,先讓我們看傳統的C#語言是如何設計接口的吧:

public interface Person
{
    string GetName();
    void SetName(string name);
}
public class Man : Person
{
    private string _name; 

    public string GetName()
    {
        return _name;
    }
    public void SetName(string name)
    {
        _name = name;
    }
} 

接口中可以聲明屬性、方法、事件和類型(Structure),(但不能聲明變量),但是并不能設置這些成員的具體值,也就是說,只能定義,不能給它里面定義的東西賦值,而接口作為它的繼承類或者派生類的規約,繼承類或者它的派生類能夠共同完成接口屬性、方法、事件和類型的具體實現,因為這里GetName(),SetName(),不管是方法名還是屬性調用順序上都是要保持一致的;

那么有了這樣的一個基于接口的思想,我們設計Javascript的接口類的時候也需要考慮到這個規范。我先從主JS文件調用端開始說起:

var Person = new Interface("Person", [["getName", 0], ["setName", 1]]); 

其中Interface類是稍后要說的接口類,第一個參數"Person"是接口類的名稱,第二個參數是個二維數組,"getName"是接口方法的名稱,"0"是該方法所帶的參數個數(因為Javascript是弱語言,所以類型是不確定的,所以只要記住參數個數就好,"0"可以省略不寫),"setName"同理。這樣一個接口定義好了。怎樣使用它呢?

function Man() 
{
    this.name = "";
    Interface.registerImplements(this, Person);
}
Man.prototype.getName = function() {
    return this.name;
};
Man.prototype.setName = function(name) {
    this.name = name;
}; 

看到Man的構造函數里面包含

Interface.registerImplements(this, Person);

它是用來將實例化的this對象繼承于Person接口,然后繼承類對接口的方法進行實現。

代碼看起來是不是很清晰和簡單呢,那么現在要開始介紹真正的核心代碼Interface.js了:

先看Interface的構造函數部分

unction Interface(name, methods) 
{
    if(arguments.length != 2) {
        throw new Error("接口構造函數含" + arguments.length + "個參數, 但需要2個參數.");
    }
    this.name = name;
    this.methods = [];
    if(methods.length < 1) {
        throw new Error("第二個參數為空數組.");
    }
    for(var i = 0, len = methods.length; i < len; i++) {
        if(typeof methods[i][0] !== 'string') {
            throw new Error("接口構造函數第一個參數必須為字符串類型.");
        }
        if(methods[i][1] && typeof methods[i][1] !== 'number') {
            throw new Error("接口構造函數第二個參數必須為整數類型.");
        }
        if(methods[i].length == 1) {
            methods[i][1] = 0;
        } 

        this.methods.push(methods[i]);
    }    
};

剛才看到了var Person = new Interface("Person", [["getName", 0], ["setName", 1]]);,這里將兩個參數分別保存起來;

#p#

調用方法部分:

Interface.registerImplements = function(object) { 

    if(arguments.length < 2) {
        throw new Error("接口的實現必須包含至少2個參數.");
    } 

    for(var i = 1, len = arguments.length; i < len; i++) {
        var interface = arguments[i];
        if(interface.constructor !== Interface) {
            throw new Error("從第2個以上的參數必須為接口實例.");
        }
        for(var j = 0, methodsLen = interface.methods.length; j < methodsLen; j++) {
            var method = interface.methods[j][0];
            if(!object[method] || typeof object[method] !== 'function' || object[method].getParameters().length != interface.methods[j][1]) {
                throw new Error("接口的實現對象不能執行" + interface.name + "的接口方法" + method + ",因為它找不到或者不匹配.");
            }
        }
    }
}; 

剛才這句Interface.registerImplements(this, Person);,實際上這里是把this對象的方法名以及參數個數與剛Person保存的methods逐一進行比較,如果找不到或者不匹配,就警告錯誤;其中object[method].getParameters().length,調用了如下的代碼:

Function.prototype.getParameters = function() { 

    var str = this.toString();
    var paramString = str.slice(str.indexOf('(') + 1, str.indexOf(')')).rep
lace(/\s*/g,''); //取得參數字符串 try { return (paramString.length == 0 ? [] : paramString.split(',')); } catch(err) { throw new Error("函數不合法!"); } }

getParrameters()方法作為Function對象的一個擴展,功能是取得方法含有的參數數組;

Interface.js完整的代碼如下:

Interface.js文件

function Interface(name, methods) 
{
    if(arguments.length != 2) {
        throw new Error("接口構造函數含" + arguments.length + "個參數, 但需要2個參數.");
    }
    this.name = name;
    this.methods = [];
    if(methods.length < 1) {
        throw new Error("第二個參數為空數組.");
    }
    for(var i = 0, len = methods.length; i < len; i++) {
        if(typeof methods[i][0] !== 'string') {
            throw new Error("接口構造函數第一個參數必須為字符串類型.");
        }
        if(methods[i][1] && typeof methods[i][1] !== 'number') {
            throw new Error("接口構造函數第二個參數必須為整數類型.");
        }
        if(methods[i].length == 1) {
            methods[i][1] = 0;
        } 

        this.methods.push(methods[i]);
    }    
}; 

Interface.registerImplements = function(object) { 

    if(arguments.length < 2) {
        throw new Error("接口的實現必須包含至少2個參數.");
    } 

    for(var i = 1, len = arguments.length; i < len; i++) {
        var interface = arguments[i];
        if(interface.constructor !== Interface) {
            throw new Error("從第2個以上的參數必須為接口實例.");
        }
        for(var j = 0, methodsLen = interface.methods.length; j < methodsLen; j++) {
            var method = interface.methods[j][0];
            if(!object[method] || typeof object[method] !== 'function' || object[method].getParameters().length != interface.methods[j][1]) {
                throw new Error("接口的實現對象不能執行" + interface.name + "的接口方法" + method + ",因為它找不到或者不匹配.");
            }
        }
    }
}; 

Function.prototype.getParameters = function() { 

    var str = this.toString();
    var paramString = str.slice(str.indexOf('(') + 1, str.indexOf(')')).replace(/\s*/g,'');     //取得參數字符串
    try
    {
        return (paramString.length == 0 ? [] : paramString.split(','));
    }
    catch(err)
    {
        throw new Error("函數不合法!");
    }
} 

好了該創建一個html頁面來試試效果了:

<script type="text/javascript">
function test()
{
    var man = new Man();
    man.setName("Leepy");
    alert(man.getName());
}
</script> 

<input type="button" value="click" onclick="test();" />

最終結果為:"Leepy"的彈出框。

這里還有一點要強調,如果接口上的方法沒有在繼承類上得到完全實現,或者方法參數個數不匹配,那么就會提示錯誤。

3. 如果我要一個類繼承于另一個類該怎么做呢,繼續看例子,這里我再定義一個SchoolBoy(男學生)類:

function SchoolBoy(classNo, post)
{
    Man.call(this);
    this._chassNo = classNo;
    this._post = post;
}
SchoolBoy.prototype = new Man();
SchoolBoy.prototype.getName = function() {
    return "Mr " + this.name;
}
SchoolBoy.prototype.setName = function(name) {
    this.name = name + "'s";
}

其中Man.call(this);實際上是將Man中的關鍵字this賦值于SchoolBoy對象中去,那么SchoolBoy就擁有了Man構造函數中的name屬性了。

SchoolBoy.prototype = new Man();實際上是把Man的prototype賦值給SchoolBoy.prototype,那么SchoolBoy就有了Man類中的方法。

而后面跟著的getName(),setName(),實際上是覆蓋了前面繼承于Man類中的方法了。

然后看看效果:

var schoolboy = new SchoolBoy("三年二班", "班長");
schoolboy.setName("周杰倫");
alert(schoolboy.getName());

最后結果為:"Mr 周杰倫's"的彈出框。

【編輯推薦】

  1. JavaScript將成Silverlight的最大對手?
  2. 探秘IE8 JavaScript功能超乎想象
  3. JavaScript+CSS實現網頁換膚功能
責任編輯:楊鵬飛 來源: 博客園
相關推薦

2023-09-27 23:28:28

Python編程

2011-05-25 10:59:26

Javascript繼承

2010-10-08 09:13:15

oop模式JavaScript

2011-05-25 11:15:02

Javascript繼承

2011-05-13 11:05:52

javascript

2011-05-13 10:51:25

javascript

2011-05-13 09:58:46

javascript

2011-05-13 11:17:18

javascript

2011-05-13 12:38:58

javascript

2011-05-13 11:27:59

javascript

2020-10-20 08:35:34

JS基礎進階

2018-12-14 11:30:00

JavaScript編程前端

2009-07-08 17:42:26

this屬性

2021-01-28 08:34:30

Java對象定義

2016-10-11 15:42:08

2020-12-24 08:36:14

JavaJava基礎

2009-07-08 17:48:18

prototype屬性

2009-07-08 17:51:45

constructor

2011-07-08 10:25:55

JavaScript

2021-10-21 18:47:37

JavaScript面向對象
點贊
收藏

51CTO技術棧公眾號

国产美女三级无套内谢| 手机在线成人av| 超碰在线免费播放| 成人性视频网站| 欧美在线视频观看| 国产男女猛烈无遮挡在线喷水| 国产一区 二区| 欧美日韩中文在线| 日韩视频在线观看视频| 午夜成人鲁丝片午夜精品| 日本不卡的三区四区五区| 操人视频在线观看欧美| 特级西西人体wwwww| 午夜不卡一区| 日韩欧美精品在线观看| 性生活免费观看视频| 日韩电影免费| 国产成人亚洲精品狼色在线| 国产精品久久久久久av福利| 精品亚洲永久免费| 91久久高清国语自产拍| 亚洲女人天堂网| 国产精品成人免费一区久久羞羞| 欧美aaa大片视频一二区| 亚洲国产另类精品专区| 国产免费色视频| 国外av在线| 99久久99久久精品国产片果冻 | 激情丁香综合五月| 国产成人精品久久久| 日本一级淫片色费放| 亚洲一区二区三区| 中文字幕在线精品| 扒开jk护士狂揉免费| 久久男人av| 精品成人在线观看| 亚欧美一区二区三区| 嫩草伊人久久精品少妇av杨幂| 午夜精品123| 久久亚洲精品无码va白人极品| 免费在线观看黄色| 欧美国产禁国产网站cc| 欧美精品欧美精品系列c| 欧美 日韩 国产 在线| 国产精品亚洲综合一区在线观看| 国产中文字幕日韩| 88av在线视频| 另类小说综合欧美亚洲| 国产欧美日韩免费看aⅴ视频| 国产精品视频一区在线观看| 欧美亚洲自偷自偷| 91高清视频免费观看| 久久久久久久久久影院| 一区二区视频欧美| 韩剧1988在线观看免费完整版| 五月婷婷一区二区| 国产一区二区三区四区三区四| 欧美日韩成人黄色| 国产在线观看免费av| 亚洲精品美女91| 欧美在线视频一区| 久久久久久在线观看| 久久不射中文字幕| 国产精品一区二区性色av | 精品乱人伦小说| 成年人小视频在线观看| 麻豆国产欧美一区二区三区r| 亚洲国产精品人人爽夜夜爽| 自拍视频一区二区| 国产a久久精品一区二区三区| 亚洲午夜色婷婷在线| 国产91丝袜美女在线播放| 久久亚洲国产| 欧美肥婆姓交大片| 日本亚洲欧美在线| 久久精品亚洲| 国产综合久久久久| 空姐吹箫视频大全| 久久午夜免费电影| 永久久久久久| 国产精品探花在线| 色综合色综合色综合 | 欧美黄色网络| 日韩欧美国产不卡| mm131美女视频| 91亚洲人成网污www| 欧美激情日韩图片| 成人免费视频国产免费| 国产麻豆午夜三级精品| 久久久久久一区| 国产视频在线播放| 欧美视频一二三| 午夜福利123| 九九综合在线| 欧美另类69精品久久久久9999| 国产成人精品一区二三区| 免费高清视频精品| 国产一区不卡在线观看| a视频网址在线观看| 亚洲国产成人av网| 怡红院亚洲色图| 欧美日韩导航| 久久国产精品久久国产精品| 二区视频在线观看| 国产精品一区在线| 日本一区二区三区四区高清视频| 91精品久久| 91福利社在线观看| 中文字幕视频观看| 久久香蕉国产| 浅井舞香一区二区| 黄色片一区二区三区| 国产精品美女久久久久av爽李琼| 久久久久久免费看| 日韩五码电影| 亚洲情综合五月天| 日本熟妇成熟毛茸茸| 激情文学综合插| 日本一区高清不卡| 两个人看的在线视频www| 在线播放91灌醉迷j高跟美女 | 国产欧美日韩丝袜精品一区| 视频一区 中文字幕| 亚洲天堂av一区| 在线观看免费视频高清游戏推荐| 亚洲深夜福利在线观看| 性色av一区二区三区| 好吊视频一二三区| 亚洲欧美色一区| 日本超碰在线观看| 国内精品久久久久久99蜜桃| 欧美中文在线免费| 天堂av资源在线| 亚洲国产成人av网| 色姑娘综合天天| 99久久久久| 91精品久久久久久综合乱菊| 福利视频在线看| 91国产免费看| 能免费看av的网站| 噜噜噜在线观看免费视频日韩 | 女人扒开腿免费视频app| 日本成人小视频| 国产精品亚洲精品| 一级毛片视频在线观看| 欧美日韩三级一区| 黄色国产在线观看| 国产农村妇女精品一区二区| 国产综合18久久久久久| 婷婷成人激情| 欧美久久久久久蜜桃| 91大神福利视频| 久久精品国产99国产精品| 亚洲午夜精品久久久久久浪潮| 国产私拍福利精品视频二区| 亚洲网站视频福利| 在线观看日批视频| 亚洲欧美国产三级| 亚洲AV成人精品| 最新亚洲视频| 日韩免费三级| 在线不卡一区| 欧美久久久精品| 欧美视频一二区| 欧美性猛交xxxx黑人猛交| 好吊视频在线观看| 精品一区在线看| 欧美另类videosbestsex日本| jizzyou欧美16| 久久精品中文字幕电影| 丰满人妻熟女aⅴ一区| 午夜精品久久久久| 丁香激情五月少妇| 国产乱码精品一区二区三区五月婷 | 夜夜操天天操亚洲| 国产美女视频免费观看下载软件| 销魂美女一区二区三区视频在线| 日韩久久久久久久久久久久久| 日韩国产一二三区| 久久久久久午夜| 国产黄色在线| 91精品麻豆日日躁夜夜躁| 国产一级av毛片| 久久免费午夜影院| 成人不卡免费视频| 亚洲精品裸体| 一区二区三区在线视频111| 日韩一区二区三区精品| 亚洲97在线观看| 91.xxx.高清在线| 日韩精品资源二区在线| 成人免费视频国产免费| 一二三四社区欧美黄| 无码人妻aⅴ一区二区三区69岛| 另类欧美日韩国产在线| 男人日女人视频网站| 色777狠狠狠综合伊人| 国产一区二区视频在线免费观看| 成人黄色图片网站| 97国产精品视频人人做人人爱| 99reav在线| 日韩精品欧美激情| 精品久久无码中文字幕| 日本韩国欧美三级| 国产亚洲精品av| 国产精品久久久久aaaa| 成人网站免费观看| 国产成a人无v码亚洲福利| 狠狠躁狠狠躁视频专区| 亚洲激情不卡| 欧美交换配乱吟粗大25p| 精品国产a一区二区三区v免费| av成人综合网| 四虎精品永久免费| 国产精品www网站| 91www在线| 欧美裸体男粗大视频在线观看| 国产黄在线看| 日韩乱码在线视频| 午夜精品久久久久久久96蜜桃| 欧美午夜精品理论片a级按摩| 日韩欧美视频在线免费观看| 亚洲男人的天堂在线aⅴ视频 | 亚洲欧美一区二区三区极速播放| 一区二区伦理片| 久久在线免费观看| 亚洲无人区码一码二码三码| 黑人巨大精品欧美黑白配亚洲| 激情视频综合网| 噜噜噜在线观看免费视频日韩| www.xxx麻豆| 中文精品久久| 在线国产99| 日韩精品91| 日韩欧美激情一区二区| 日韩激情网站| 国产精品久久久久久久免费大片 | 精品在线观看一区二区| 成人台湾亚洲精品一区二区| 亚洲淫片在线视频| 精品视频一区二区三区在线观看| 国产一区二区在线免费视频| 中文另类视频| 国产精品老牛影院在线观看| 激情开心成人网| 国产成人精品视| 精品视频在线一区二区在线| 国产91色在线|免| av在线日韩| 国产精品一区二区久久精品| 亚洲最大的免费视频网站| 成人疯狂猛交xxx| 日本综合精品一区| 国产精品日韩一区二区三区| 秋霞在线一区| 欧美日韩在线一二三| 国产欧美日韩免费观看| 亚洲高清视频在线观看| 99久久亚洲精品蜜臀| 2021国产视频| 亚洲美女毛片| 无遮挡又爽又刺激的视频 | 午夜激情综合网| 国产女主播喷水视频在线观看| 欧美视频一二三区| 国产三级第一页| 亚洲第一中文字幕在线观看| 日本一卡二卡四卡精品| 一区二区三区视频免费在线观看| 3p视频在线观看| 欧美人在线观看| 色资源二区在线视频| 国产精品美女久久| 欧美激情精品| 乱色588欧美| 日韩三级在线| 久久这里只有精品8| 久久亚洲美女| 日本成人xxx| 91女神在线视频| 色哟哟一一国产精品| 午夜在线电影亚洲一区| 波多野结衣家庭主妇| 欧美一区二区在线不卡| 亚洲aaaaaaa| 俺去亚洲欧洲欧美日韩| jizzjizz中国精品麻豆| 国产精品第一页在线| 日韩成人在线观看视频| 欧美日韩在线精品一区二区三区| 亚洲国产精品91| 日本中文字幕片| 国产精品一二三区在线| 国产精品无码一区二区三区| 亚洲精品乱码久久久久久| 亚洲av无码精品一区二区 | 欧美婷婷久久五月精品三区| 最新国产精品亚洲| 人在线成免费视频| 91在线视频免费| 精品免费一区二区| 亚洲国产精品无码av| 蜜臀99久久精品久久久久久软件| 成年人的黄色片| 亚洲女与黑人做爰| 波多野结衣大片| 日韩国产在线播放| 天堂av在线电影| 国产日韩综合一区二区性色av| 女人抽搐喷水高潮国产精品| 欧美少妇一区二区三区| 日韩国产一区二| 久久午夜夜伦鲁鲁片| 亚洲综合色区另类av| 一本一道人人妻人人妻αv| 精品视频久久久| 国内在线视频| 亚洲v日韩v综合v精品v| 欧美伦理在线视频| 国产a视频免费观看| 成人av在线资源网| 免费视频网站www| 5858s免费视频成人| 中国日本在线视频中文字幕| 日本电影亚洲天堂| 日韩激情毛片| 日韩av三级在线| 成人精品亚洲人成在线| 深夜福利影院在线观看| 欧美一二三区在线| 图片区小说区亚洲| 亚洲字幕在线观看| 亚洲老妇激情| 日韩av一卡二卡三卡| 成人欧美一区二区三区在线播放| 国产精品第6页| 有码中文亚洲精品| 一区在线影院| 亚洲欧美日韩另类精品一区二区三区 | 精品人妻无码中文字幕18禁| 亚洲三级电影网站| 国产免费黄色片| 粗暴蹂躏中文一区二区三区| 四虎国产精品成人免费影视| 懂色av一区二区三区四区五区| 国产一区二区三区在线观看精品| 免费成人美女女在线观看| 欧美精品乱码久久久久久按摩| 免费网站成人| 亚洲一区二区免费在线| 欧美日韩理论| av免费观看不卡| 精品国产91久久久久久老师| 日韩电影在线观看完整版| 国产精品99一区| 色综合咪咪久久网| 99中文字幕在线| 亚洲五码中文字幕| 婷婷亚洲一区二区三区| 国产99久久精品一区二区永久免费| 精品日产免费二区日产免费二区| 手机免费av片| 亚洲伊人色欲综合网| 午夜在线视频免费| 国产精品福利网| 亚洲h色精品| 一本色道综合久久欧美日韩精品 | 人妻无码视频一区二区三区| 国产精品网站在线观看| 国产区精品在线| 国语自产精品视频在线看抢先版图片| 欧美激情极品| 亚洲 激情 在线| 亚洲综合一区在线| 午夜av免费观看| 国产免费亚洲高清| 影音先锋久久久| 性の欲びの女javhd| 日韩一区二区三区在线观看| 涩涩视频在线免费看| 亚洲砖区区免费| 成人精品高清在线| 中国a一片一级一片| 欧美人与物videos| 国产一区二区欧美| 熟妇无码乱子成人精品| 欧美色道久久88综合亚洲精品| 麻豆视频网站在线观看| 国产一区二区视频在线免费观看| 麻豆精品久久久| 日韩av在线播| 色偷偷88888欧美精品久久久 | 精品三级在线| 日韩视频在线视频| 国产精品成人在线观看| 天天爱天天干天天操| 成人福利网站在线观看11| 香蕉成人久久| 欧美三级在线免费观看| 一区二区三区高清国产|