亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 語言 > JavaScript > 正文

javascript關于繼承的用法匯總

2024-05-06 16:12:34
字體:
來源:轉載
供稿:網友
這篇文章主要介紹了javascript關于繼承的用法,實例匯總了常見的javascript關于繼承的用法,具有一定的參考借鑒價值,需要的朋友可以參考下
 
 

本文實例匯總了javascript關于繼承的用法。分享給大家供大家參考。具體如下:

例子:

復制代碼代碼如下:
/**
* 實現子類繼承父類,但不會產生多余的屬性和方法
* @returns {Function}
*/
define(function(){
return function(subType, superType){
var proto = new Object(superType.prototype);
proto.constructor = subType;
subType.prototype = proto;
};
});
//——————————————————————————
define(function(){
function ostring(s)
{
this.str = s;
this.length = this.str.length;
}
ostring.prototype.show = function(){
alert(this.str);
};
return ostring;
});
//——————————————————————————
define(['inherit', 'ostring'], function(inherit, ostring){
function wstring(s){
//用call實現調用父類構造函數
ostring.call(this, s);
this.chlength = 2 * s.length;
}
//繼承其他的屬性
inherit(wstring, ostring);
wstring.prototype.add = function(w)
{
alert(this.str + w);
};
return wstring;
});

 

再看例子
一、用function實現:

復制代碼代碼如下:
function Person(name) {
    this.name = name;
}
Person.prototype.getName = function() {
    return this.name;
}
function Author(name, books) {
    this.inherit=person;
    this.inherit(name);
    this.books = books;
    
}
var au=new Author("dororo","Learn much");
au.name

或者同等效力的:
復制代碼代碼如下:
function Person(name) {
    this.name = name;
}
Person.prototype.getName = function() {
    return this.name;
}
function Author(name, books) {
    Person.call(this, name);
    this.books = books;
    
}
var au=new Author("dororo","Learn much");
au.getName

由于這只是將this作為參數,調用父類Person的構造函數,把賦予父類的所有域賦予Author子類,所以任何父類Person構造函數之外的定義的域(原型prototype),子類都不會繼承。所以上面例子中,au.getName將是沒有被定義的(undefined),因為getName是在Person的原型對象中定義的。

 

而且,子類的構造函數要在定義自己的域之前調用父類構造函數,免得子類的定義被父類覆蓋掉。也就是說,Author定義屬性book要在Person.call之后,否則會被Person中屬性覆蓋。同時,在子類中也最好不要用prototype來定義子類的函數域,因為在一個子類被new,實例化之后就要執行prototype,然后才是調用父類的構造函數,這樣也容易被父類的屬性覆蓋掉。

二、用prototype實現:

復制代碼代碼如下:
function Person(name) {
    this.name = name;
}
Person.prototype.getName = function() {
    return this.name;
}
function Author(name, books) {
    this.books = books;  
}
Author.prototype=new Person(name);
Author.prototype.constructor=Author;
Author.prototype.getBooks = function() {
    return this.books;
}
var au1=new Author("dororo1","Learn much");
var au2=new Author("dororo2","Learn less");
alert(au1.getName());
alert(au2.getName());

這種方法避免了function實現中,無法繼承prototype的問題。因為 Author.prototype=new Person(name);new Person()實例會調用Person構造和原型的所有屬性。但是缺點是已經實例化了Author.prototype。所以當子類實例化的時候,所有非基本數據類型都是reference copy。所以上面例子中,無論實例au1,還是au2返回的值都是dororo1.

 

三、用“混合”實現

復制代碼代碼如下:
function Person(name) {
    this.name = name;
}
Person.prototype.getName = function() {
    return this.name;
}
function Author(name, books) {
    this.base = new Person(name);
    for(var key in this.base){
        if(!this[key]){
           this[key]=this.base[key];
           }
           }
    this.book=books;
}
var au1=new Author("dororo1","work");
var au2=new Author("dororo2","play");
alert(au1.getName());
alert(au2.getName());
au1.book;
au2.book;

 
屬于擴展,把父類的所有域都拷貝到子類。完全沒有上述兩方面的問題。
寄生組合模式)

 

JS的繼承包括屬性的繼承和方法的繼承,他們分別通過不同的方法來實現。
1.屬性的繼承

屬性的繼承通過改變函數的執行環境來實現的。而改變函數的執行環境可以使用call()和apply()兩種方法來實現。

我們首先創建一個Animal“類”(因為JS中沒有類的概念,這里只是一個模擬,它實際上只是一個Function函數對象)。

復制代碼代碼如下:
function Animal(typeName) {
//為當前方法的執行環境(this)添加一個屬性typeName
//但是執行環境(this)要執行這個函數的時候才能確定
this.typeName = typeName;
this.colors = ["red","while"];
}
//想函數的原型里 添加 兩個(對象共享的)的方法
Animal.prototype.Shout = function () { alert("我是:--" + this.typeName);};
Animal.prototype.Eat = function () { alert("我是:--" + this.typeName) };
//--定義一個獅子--“類”(其實就是一個函數)
function Lion(tn) {
//--執行Animal方法,并通過apply的第一個參數 修改了Animal的執行環境為Lion的this
//同樣的,Lion的this,也要在執行的時候才能確定是誰
Animal.apply(this,["獅子"]);//--繼承了父類的變量屬性,this因為是new了Lion,this是Lion
}
Lion.prototype = Animal.prototype; //繼承父類的方法,搞定--但是這寫不好,當子類再添加方法時候,父類同樣也有此方法,這是指針引用
Lion.prototype.Hunt = function () {
alert("我是:獅子,我要去捕獵~~·~");
}
var aminm = new Animal();
aminm.Hunt(); //---可以訪問到子類的方法,這樣就不好了
//----那么如何解決這個問題呢》??????
//---解決方案:繼承方法時候可以這樣寫:
Lion.prototype = new Animal();//繼承父類的方法,把Animal對象賦給了prototype原型,其實它里面也有屬性
var lion = new Lion(); //new 關鍵字除了創建的,還會修改Lion對象的執行環境為Lion對象本身
// ---換句話說,就是new完了之后,Lion函數里的this就是Lion函數本身了,然后調用Lion函數

 

分析一下new關鍵字:

而new關鍵字是十分偉大的,在上段代碼中,new關鍵字完成了以下幾項工作:
1)開辟堆空間,以準備存儲Lion對象
2)修改Lion對象本身的執行環境,使得Lion函數的this指向了Lion函數對象本身。
3)調用Lion“類”的“構造函數”,創建Lion對象
4)將Lion函數對象的堆地址賦值給變量l,這個時候l就指向了這個Lion函數對象
lion.Shout();
lion.Eat();
但是這種繼承有個缺點:就是父類的構造函數的被調用了兩次,call一次,然后new又一次。

希望本文所述對大家的javascript程序設計有所幫助。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
www.日韩免费| 亚洲永久在线观看| 国产精品一区久久久| 亚洲精品电影网| 国产精品色悠悠| 久久国产精品免费视频| 亚洲xxx视频| 国产91久久婷婷一区二区| 欧美激情久久久久久| 91亚洲国产成人精品性色| 亚洲欧美另类自拍| 欧美国产日韩二区| 亚洲精品98久久久久久中文字幕| 国产精品一区二区三区免费视频| 亚洲永久在线观看| 亚洲色图五月天| 亚洲sss综合天堂久久| 日韩精品www| 亚洲久久久久久久久久久| 2019中文字幕在线| 欧美一级片免费在线| 亚洲国产毛片完整版| 精品国产31久久久久久| 国产精品扒开腿爽爽爽视频| 91在线看www| 欧美裸体男粗大视频在线观看| 在线观看国产精品淫| 色青青草原桃花久久综合| 午夜精品久久久久久久久久久久| 亚洲国产精品久久久| 中文字幕欧美日韩在线| 亚洲成色999久久网站| 国产精品高潮呻吟久久av黑人| 日韩中文字幕在线免费观看| 国产欧美在线观看| 国产香蕉精品视频一区二区三区| 色99之美女主播在线视频| 中文字幕精品网| 午夜精品福利电影| 热99久久精品| 成人久久久久爱| 久国内精品在线| 国产精品视频网站| 国语自产精品视频在线看抢先版图片| 欧美日韩免费区域视频在线观看| 日韩成人中文字幕在线观看| 国内成人精品视频| 中文字幕日韩综合av| 国产精品日韩欧美综合| 日韩av免费在线看| 国产自摸综合网| 在线观看欧美成人| 色黄久久久久久| 欧美色欧美亚洲高清在线视频| 国产欧美精品日韩精品| 黄色精品在线看| 欧美视频第一页| 亚洲精品欧美日韩| 亚洲色图欧美制服丝袜另类第一页| 亚洲人成在线观看| 亚洲最大的免费| 欧美在线视频观看免费网站| 中文字幕视频一区二区在线有码| 亚洲色图第三页| 丝袜情趣国产精品| 亚洲精品日韩丝袜精品| 美日韩丰满少妇在线观看| 久久在线视频在线| 国产精品91一区| 日韩欧美主播在线| 美女国内精品自产拍在线播放| 亚洲第一福利网| 欧美色道久久88综合亚洲精品| 国产日韩精品在线观看| 国产精品高潮粉嫩av| 国内免费久久久久久久久久久| 日韩精品视频中文在线观看| xxx成人少妇69| 国内精品久久久久伊人av| 色狠狠av一区二区三区香蕉蜜桃| 中文欧美在线视频| 日韩欧美高清在线视频| 中文字幕亚洲无线码a| 国产有码在线一区二区视频| 国产综合香蕉五月婷在线| 庆余年2免费日韩剧观看大牛| 久久久久久久久久久亚洲| 57pao成人永久免费视频| 欧美肥老太性生活视频| 国产精品亚洲网站| 国产精品欧美一区二区三区奶水| 91久久精品视频| 色综合影院在线| 亚洲国产另类久久精品| 欧美日韩国产麻豆| 深夜福利亚洲导航| 日韩电影免费在线观看| 国产精品久久久av| 欧美老女人bb| 欧美亚洲国产视频小说| 在线看日韩欧美| 亚洲国产欧美一区| 欧美疯狂xxxx大交乱88av| 国产成人极品视频| 2018国产精品视频| 国产亚洲精品久久久久动| 最新的欧美黄色| 国产精品亚洲片夜色在线| 国产精品h在线观看| 色综合久久88色综合天天看泰| 亚洲欧美日韩中文在线制服| 夜夜嗨av色一区二区不卡| 欧美日韩国产麻豆| 国产亚洲视频在线观看| 亚洲影院高清在线| 日韩视频在线免费观看| 日韩精品免费一线在线观看| 8050国产精品久久久久久| 欧美性在线视频| 欧美亚洲另类制服自拍| 亚洲xxxx视频| 久久精品视频亚洲| 欧美肥婆姓交大片| 国产精品美女免费看| 亚洲视频视频在线| 欧美亚洲在线观看| 欧美亚洲日本网站| 久久91亚洲人成电影网站| 欧美肥臀大乳一区二区免费视频| 欧美美女15p| 91国产精品视频在线| 欧美国产乱视频| 在线观看欧美视频| 欧美性猛交xxxxx免费看| 欧美日韩免费看| 亚洲欧美中文日韩在线| 国产精品美女午夜av| 91欧美精品午夜性色福利在线| 夜色77av精品影院| 成人中心免费视频| 欧美日韩国产色| 中文字幕日本精品| 欧美中文字幕视频| 欧日韩不卡在线视频| 久久久久久久久网站| 欧美野外猛男的大粗鳮| 国产精彩精品视频| 精品动漫一区二区三区| 亚洲国产精品成人一区二区| 久久777国产线看观看精品| 国产色综合天天综合网| 欧美日韩在线免费观看| 欧美最顶级的aⅴ艳星| 欧美精品一本久久男人的天堂| 2021国产精品视频| 国产91精品最新在线播放| 51午夜精品视频| 北条麻妃在线一区二区| 国产欧美一区二区三区在线| 亚洲色无码播放| 欧美香蕉大胸在线视频观看| 97在线精品国自产拍中文| 国模精品视频一区二区| 欧美性视频在线|