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

首頁 > 編程 > JavaScript > 正文

JavaScript 繼承

2019-11-06 06:12:13
字體:
來源:轉載
供稿:網友

1. 繼承(inherit)

js本身是沒有繼承這個特性或語法的,所以js的繼承比較特殊。本質:拿來主義,原本不是自己的,但是自己可以直接用,好像就是自己的一樣,這個就是繼承。因此在js中,凡是符合上述特征的都是繼承(js中繼承沒有特定的語法)。(1)最簡單的繼承就是原型式繼承就是寫一個構造函數,在原型中添加成員,那么實例對象就含有了該成員,這就稱為實例對象繼承自原型。(2)混入式繼承(mix)在js中混入就是將一個對象的成員加到另一個對象中。典型的語法結構:
//將obj2混入到obj1中,也稱obj1繼承自obj2function mix(obj1,obj2){     for(var k in obj2){        obj1[k] = obj2[k];    }}一般在混入的時候,都是混入的函數,所以考慮深拷貝的機會較少,在jq框架中,有一個方法叫 extend ,該方法實現 jq 中的混入。該方法具有的特征是:① 將多個對象混入到一個對象中mix ( dest, obj1, obj2, obj3, ... )② 實現深拷貝③ 實現原型式繼承④ 實現對象的構造(不使用構造函數創建對象)(3)在實際開發的時候,常常是這兩種方法混合使用(混合式繼承)在構造函數的原型上使用混入,那么原型對象就具有了很多方法屬性等成員,那么構造函數的實例對象就自動的繼承了這些成員,而且還有共享。
// 1.準備一個構造函數function Role( name ) { this.name = name;}// 2.在原型中準備一個 extend 方法Role.PRototype.extend = function ( obj ) { // 將 obj 的成員混入到 原型對象中 for ( var k in obj ) {  this[ k ] = obj[ k ]; }};// 3.盡情的擴展( 繼承 )// 為了簡單這么處理Role.skill = Role.prototype;// 法術攻擊Role.skill.extend({ fireBall: function () {  console.log( '火球之術' ); }, bigFireBall: fucntion () ...});// 雷電 thunderRole.skill.extend({ qidoli: fucntion() { .... } ... });// 增加技能Role.skill.extend({ iceSkill: fucntion() { .... } ... });// 4.創建角色var sasigi = new Role( 'f' );

2. 經典繼承語法

在ES5出現以前,就有人模擬了繼承的方式,就是使用一個對象,創建出另一個對象出來,保證被創建出來的對象的原型就是這個指定的對象。
//調用該函數,可以創建一個繼承自參數給定的對象的對象function create(baSEObj){    function F(){}    F.prototype = baseObj;    return new F();}//可以創建一個對象,該對象繼承自一個數組var myArray = create( [] );//可以將myArray作為數組使用,是真數組/*增*/myArray.push('第一個被push進來的數據');myArray.unshift('第二個被unshift加入的數據');myArray[myArray.length++]='利用數組索引加入的數據';/*刪*/myArray.pop();//刪并返回最后一個myArray.shift();//刪并返回第一個myArray.splice(1,1);/*改*/myArray[1] = '哈哈哈';myArray.splice(1,1,'a','b','c');//從下標為1開始,刪掉1個元素,把后面的數據插入此位置/*查*/var i1 = myArray.indexOf('b');在較新的 ES5 的規范中已經內置了該算法,使用 Object.create 來實現該功能。所謂的簡單對象,首先要保證簡單,沒有多余的復雜數據:
var obj = Object.create(null);console.log(obj); //空的簡單對象,里面什么都沒有沒有寫構造函數,obj 就是 Object 創建出來的。
var obj = Object.create(base);//此時是一種特殊情況,obj 沒有構造函數,是內部創建的

3. 比較高級的繼承方法

Object.create(base) => sub該方法有兩大缺點:① 沒有構造函數,無法復用② 沒有擴展,創建的子對象與父對象其實一模一樣,只是層級結構不同我們需要提供一個函數,滿足以下功能:① 可配置構造函數,由用戶決定構造函數應該如何定義② 可返回構造函數③ 應該有繼承要求可以配置,其實就是可以自己定義屬性和方法
function createClass( options ){     return function(){ //這個函數就應該是最終的構造函數    }}由于需要重新配置構造函數的內容與原型,也要配置方法,可以讓 options 中必須帶有方法數據,因此代碼可以修改為另一種形式:
function createClass( options ){     //要求 options中必須包含 constructor 和 methods    //constructor是構造函數,它需要被返回    //methods是該對象應該具有的方法,應該將方法加到原型中    options.constructor.prototype = options.methods;    return options.constructor;}簡單優化后:
function createClass( options ){     var ctr = options.constructor;    ctr.prototype = options.methods;//用替換原型的辦法    return ctr;}使用:屬性應該放在實例對象中,方法應該放在原型中。因此,兩個參數,第一個參數用于配置實例對象的成員,第二個參數用于描述原型。
var Person = createClass({    constructor: function(name,age,gender){        this.name = name;        this.age = age;        this.gender = gender;    },    methods: {        sayHello: function(){            console.log( '你好,我是'+ this.name );        },        run: function(){            console.log( '你好,'+ this.name + '在跑' );        }    }});var p = new Person('jim', 19, '男');p.sayHello();p.run();此時已經有Person了,希望再派生一個Student出來應該提供需要繼承的目標(對象?函數?)實現如下形式:那么將需要繼承的對象傳入要求options提供同一個base屬性,表明需要繼承誰代碼中的ctr的原型應該由base提供
function createClass( options ){     var ctr = options.constructor,        base = options.base || Object.prototype;    ctr.prototype = Object.create(base);//如果直接把base賦給原型,會出bug,派生對象中增加的東西在原型對象中也會增加    //方法的加入    for(var k in options.methods){        ctr.prototype[k] = options.methods[k];    }    return ctr;}正確的(ctr.prototype = Object.create(base);):錯誤的(ctr.prototype = base;):


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
高跟丝袜欧美一区| 国产97色在线|日韩| 国产丝袜高跟一区| 91久久久久久久一区二区| 性色av一区二区三区| 日韩av在线精品| 在线观看日韩视频| 国产在线观看一区二区三区| 国产在线观看不卡| 亚洲另类欧美自拍| 久久久久久高潮国产精品视| 中文字幕日韩在线播放| 亚洲跨种族黑人xxx| 色偷偷av一区二区三区| 911国产网站尤物在线观看| 久久精品亚洲精品| 欧美激情在线视频二区| 亚洲自拍偷拍网址| 国产精品视频在线观看| 成人激情在线观看| 国产精品福利网站| 日韩中文字幕不卡视频| 国产在线观看精品| 欧美高清videos高潮hd| 97视频免费看| 精品久久久精品| 久久久久久一区二区三区| 国内精品久久久久影院优| www.国产一区| 性日韩欧美在线视频| 日韩在线视频中文字幕| 亚洲国产成人精品久久久国产成人一区| 欧美专区在线视频| 中文国产成人精品久久一| 亚洲最大福利网站| 午夜免费久久久久| 国产精品福利网站| 午夜精品久久久久久久99热浪潮| 国产精品一二区| 国产精品久久色| 欧美另类在线观看| 久久亚洲精品中文字幕冲田杏梨| 精品久久久久久久久国产字幕| 欧美激情奇米色| 欧美第一页在线| 亚洲第一页自拍| 全色精品综合影院| 欧美精品亚州精品| 欧美在线激情网| 国产精品入口日韩视频大尺度| 91久久精品国产| 亚洲激情第一页| 欧美精品videosex牲欧美| 久久久这里只有精品视频| 中文字幕日韩欧美在线| 国产精品亚发布| 国产午夜精品全部视频播放| 午夜美女久久久久爽久久| 久久久成人的性感天堂| 久久久久久久久久久久av| 亚洲夜晚福利在线观看| 成人av在线天堂| 精品一区二区亚洲| 日韩欧美精品中文字幕| 国产福利精品av综合导导航| 97在线看福利| 精品视频在线播放免| 欧美国产亚洲精品久久久8v| 久久精品亚洲一区| 亚洲成年网站在线观看| 日韩中文第一页| 亚洲福利在线观看| 亚洲精品小视频在线观看| 中文字幕久精品免费视频| 日韩经典第一页| 欧美性猛交99久久久久99按摩| 国产香蕉精品视频一区二区三区| 欧美日韩一区二区精品| 国产免费一区二区三区香蕉精| 日本精品一区二区三区在线播放视频| 日韩欧美aⅴ综合网站发布| 狠狠色狠狠色综合日日五| 夜夜狂射影院欧美极品| 伊人久久久久久久久久| 日韩经典中文字幕| 成人有码在线播放| 精品日韩视频在线观看| 欧美高清在线视频观看不卡| 国产精品男人的天堂| 亚洲精品成人久久电影| 成人中文字幕在线观看| 久久偷看各类女兵18女厕嘘嘘| 欧美电影免费观看高清完整| 国产精品久久久久av| 亚洲精品视频免费| 国产欧美精品一区二区三区-老狼| 欧美中文字幕在线| 久久免费视频在线| 欧美电影免费观看电视剧大全| 美女av一区二区三区| 亚洲人成电影网站色| 国产午夜精品理论片a级探花| 国产亚洲精品久久久| 97超级碰碰人国产在线观看| 国产成人a亚洲精品| 久久久久久久电影一区| 日韩欧美精品网址| 成人在线精品视频| 911国产网站尤物在线观看| 国产成人一区二区三区| 亚洲男人天堂2023| 日韩黄在线观看| 一区二区三区在线播放欧美| 欧美电影在线观看| 亚洲毛片一区二区| 欧美视频一二三| 亚洲成色999久久网站| 亚洲美女精品久久| 欧美一区亚洲一区| 日韩在线视频免费观看| 97**国产露脸精品国产| 国产精品久久久久久久久久东京| 国产综合在线视频| 欧美国产日韩xxxxx| 久久精视频免费在线久久完整在线看| 国产精品视频免费在线观看| 成人黄色免费网站在线观看| 亚洲香蕉成人av网站在线观看| 国产综合在线视频| 日韩欧美国产激情| 亚洲午夜国产成人av电影男同| 91综合免费在线| 国产欧美日韩91| 久久深夜福利免费观看| 日韩欧美主播在线| 久久久国产精品视频| 国产精品扒开腿爽爽爽视频| 国产精品久久电影观看| 91精品国产91久久久久久吃药| 国产成人aa精品一区在线播放| 欧美亚洲一级片| 国产亚洲日本欧美韩国| 国产999精品久久久影片官网| 国产精品久久久久久久久久久新郎| 欧美性xxxxxxxxx| 亚洲二区中文字幕| 国产成人中文字幕| 亚洲综合色激情五月| 亚洲国产精品久久| 日韩hd视频在线观看| 国产精品久久久久久久久久新婚| 欧美日韩中文字幕在线视频| 精品亚洲一区二区三区在线观看| 亚洲精品视频二区| 97国产精品视频| 欧美在线一区二区三区四| 97久久精品视频| 精品视频9999| 亚洲激情免费观看| 国产成人一区二区三区电影| 欧美夫妻性视频| 中文字幕精品在线视频| 亚洲视频国产视频| 久久人人97超碰精品888|