1. 程式人生 > >js物件的三種繼承方式

js物件的三種繼承方式

一,js中物件繼承
js中有三種繼承方式
1.js原型(prototype)實現繼承
複製程式碼 程式碼如下:


<SPAN style="BACKGROUND-COLOR: #ffffff"><SPAN style="FONT-SIZE: 18px"><html>  
<body>  
<script type="text/javascript">  
    function Person(name,age){  
        this.name=name;  
        this.age=age;  
    }  
    Person.prototype.sayHello=function(){  
        alert("使用原型得到Name:"+this.name);  
    }  
    var per=new Person("馬小倩",21);  
    per.sayHello(); //輸出:使用原型得到Name:馬小倩  


      
    function Student(){}  
    Student.prototype=new Person("洪如彤",21);  
    var stu=new Student();  
    Student.prototype.grade=5;  
    Student.prototype.intr=function(){  
        alert(this.grade);  
    }  
    stu.sayHello();//輸出:使用原型得到Name:洪如彤  
    stu.intr();//輸出:5  
</script>  
</body>  
</html></SPAN></SPAN>  


2.建構函式實現繼承
複製程式碼 程式碼如下:


<SPAN style="FONT-SIZE: 18px"><html>  
<body>  
<script type="text/javascript">  
    function  Parent(name){  
        this.name=name;  
        this.sayParent=function(){  
            alert("Parent:"+this.name);  
        }  
    }  


    function  Child(name,age){  
        this.tempMethod=Parent;  
        this.tempMethod(name);  
        this.age=age;  
        this.sayChild=function(){  
            alert("Child:"+this.name+"age:"+this.age);  
        }  
    }  


    var parent=new Parent("江劍臣");  
    parent.sayParent(); //輸出:“Parent:江劍臣”  
    var child=new Child("李鳴",24); //輸出:“Child:李鳴 age:24”  
    child.sayChild();  
</script>  
</body>  
</html></SPAN> 


3.call , apply實現繼承
複製程式碼 程式碼如下:


<SPAN style="FONT-SIZE: 18px"><html>  
<body>  
<script type="text/javascript">  
    function  Person(name,age,love){  
        this.name=name;  
        this.age=age;  
        this.love=love;  
        this.say=function say(){  
            alert("姓名:"+name);  
        }  
    }  


    //call方式  
    function student(name,age){  
        Person.call(this,name,age);  
    }  


    //apply方式  
    function teacher(name,love){  
        Person.apply(this,[name,love]);  
        //Person.apply(this,arguments); //跟上句一樣的效果,arguments  
    }  


    //call與aplly的異同:  
    //1,第一個引數this都一樣,指當前物件  
    //2,第二個引數不一樣:call的是一個個的引數列表;apply的是一個數組(arguments也可以)  


    var per=new Person("武鳳樓",25,"魏熒屏"); //輸出:“武鳳樓”  
    per.say();  
    var stu=new student("曹玉",18);//輸出:“曹玉”  
    stu.say();  
    var tea=new teacher("秦傑",16);//輸出:“秦傑”  
    tea.say();  


</script>  
</body>  
</html></SPAN>  


二、call和apply的用法(詳細介紹)
js中call和apply都可以實現繼承,唯一的一點引數不同,func.call(func1,var1,var2,var3)對應的apply寫法為:func.apply(func1,[var1,var2,var3])。
JS手冊中對call的解釋:
複製程式碼 程式碼如下:


<SPAN style="FONT-SIZE: 18px">call 方法  
呼叫一個物件的一個方法,以另一個物件替換當前物件。  


    call([thisObj[,arg1[, arg2[,   [,.argN]]]]])  


引數  
thisObj  
可選項。將被用作當前物件的物件。  


arg1, arg2,  , argN  
可選項。將被傳遞方法引數序列。  


說明  
call 方法可以用來代替另一個物件呼叫一個方法。call 方法可將一個函式的物件上下文從初始的上下文改變為由 thisObj 指定的新物件。  


如果沒有提供 thisObj 引數,那麼 Global 物件被用作 thisObj。</SPAN>  


說簡單一點,這兩函式的作用其實就是更改物件的內部指標,即改變物件的this指向的內容。這在面向物件的js程式設計過程中有時是很有用的。下面以apply為例,說說這兩個函式在 js中的重要作用。如:
複製程式碼 程式碼如下:


<SPAN style="FONT-SIZE: 18px"> function Person(name,age){   //定義一個類   
        this.name=name;     //名字   
        this.age=age;       //年齡   
        this.sayhello=function(){alert(this.name)};  
    }  
    function Print(){            //顯示類的屬性   
        this.funcName="Print";  
        this.show=function(){  
            var msg=[];  
            for(var key in this){  
                if(typeof(this[key])!="function"){  
                    msg.push([key,":",this[key]].join(""));  
                }  
            }  
            alert(msg.join(" "));  
        };  
    }  
    function Student(name,age,grade,school){    //學生類   
        Person.apply(this,arguments);//比call優越的地方   
        Print.apply(this,arguments);  
        this.grade=grade;                //年級   
        this.school=school;                 //學校   
    }  
    var p1=new Person("卜開化",80);  
    p1.sayhello();  
    var s1=new Student("白雲飛",40,9,"嶽麓書院");  
    s1.show();  
    s1.sayhello();  
    alert(s1.funcName);</SPAN>  


另外,Function.apply()在提升程式效能方面有著突出的作用:
我們先從Math.max()函式說起,Math.max後面可以接任意個引數,最後返回所有引數中的最大值。
比如
複製程式碼 程式碼如下:


<SPAN style="FONT-SIZE: 18px">alert(Math.max(5,8));   //8   
    alert(Math.max(5,7,9,3,1,6));   //9   


    //但是在很多情況下,我們需要找出陣列中最大的元素。   


    var arr=[5,7,9,1];  
    //alert(Math.max(arr));    // 這樣卻是不行的。NaN   


    //要這樣寫   
    function getMax(arr){  
        var arrLen=arr.length;  
        for(var i=0,ret=arr[0];i<arrLen;i++){  
            ret=Math.max(ret,arr[i]);  
        }  
        return ret;  
    }  


    alert(getMax(arr)); //9   


    //換用apply,可以這樣寫   
    function getMax2(arr){  
        return Math.max.apply(null,arr);  
    }  


    alert(getMax2(arr)); //9   


    //兩段程式碼達到了同樣的目的,但是getMax2卻優雅,高效,簡潔得多。   


    //再比如陣列的push方法。   
    var arr1=[1,3,4];  
    var arr2=[3,4,5];  
    //如果我們要把 arr2展開,然後一個一個追加到arr1中去,最後讓arr1=[1,3,4,3,4,5]   
    //arr1.push(arr2)顯然是不行的。 因為這樣做會得到[1,3,4,[3,4,5]]   


    //我們只能用一個迴圈去一個一個的push(當然也可以用arr1.concat(arr2),但是concat方法並不改變arr1本身)   


    var arrLen=arr2.length;  
    for(var i=0;i<arrLen;i++){  
        arr1.push(arr2[i]);  
    }  


    //自從有了Apply,事情就變得如此簡單   


    Array.prototype.push.apply(arr1,arr2); //現在arr1就是想要的結果</SPAN>  

相關推薦

js繼承方式及其優缺點

第一種,prototype的方式: //父類 function person(){ this.hair = 'black'; this.eye = 'black'; this.skin = 'yellow';

js物件繼承方式

一,js中物件繼承 js中有三種繼承方式 1.js原型(prototype)實現繼承 複製程式碼 程式碼如下: <SPAN style="BACKGROUND-COLOR: #ffffff"><SPAN style="FONT-SIZE: 18px">

繼承方式訪問權限

-a prot play 9.png png -h .cn orm font 也就是說子類只能訪問父類的保護和公有成員,而對象只能訪問公有成員。繼承方式 1. 三種繼承方式不影響子類對父類的訪問權限,子類對父類只看父類的訪問控制權。 2. 繼承

js引入方式

clas scrip 三種 rip html html元素 js文件 NPU htm 行內 寫在HTML元素內部 <input type="button" value="按鈕" onclick="alert('

C++中類的繼承方式public(公有繼承)、protected(保護繼承)、private(私有繼承)之間的差別(附思維導圖)【轉】

(轉自:https://blog.csdn.net/coco56/article/details/80467975) 注:若不指明繼承方式,則預設是私有繼承。 一:對於公有繼承(public)方式: 基類的public和protected成員的訪問屬性在派生類中保持不變,但基類的p

C++: 繼承和多型(一)繼承方式與許可權

繼承 在C++中,我們常要對某個函式進行多次複用,例如: 資訊管理系統中,對於教師、學生、教務人員等"類"而言,有部分資訊是通用的:姓名,性別,年齡,聯絡方式等。如果為每一種角色都編寫一個"類",會有不少重複的程式碼,造成效率上的浪費。       &nbs

JS輸出方式

1.window.alert(”),彈框效果,window可省略。彈出比較突然,使用者的體驗不好,基本用來測試程式碼使用。 <script type="text/javascript"> /* * window.alert()

類的繼承方式可訪問性和友元函式.cpp

/*類的三種繼承方式可訪問性和友元函式 */# include <iostream> using namespace std;class A{        friend int get(const A& a);//宣告該函式為A的友元函式,使之可以在外部訪問A,友元函式也可以繼承publ

類的繼承方式

類的繼承方式——公有型(public)、保護型(protected)、私有型(private), 訪問控制修飾符也有public、protected、private3種類型。繼承方式不同,可訪問性也不同

C++的訪問許可權與繼承方式

三種訪問許可權 我們知道C++中的類,有三種訪問許可權(也稱作訪問控制),它們分別是public、protected、private。要理解它們其實也很容易,看下面了一個例子。 父類: class Person { public: Person

C++ 繼承方式和建構函式執行的順序

C++中的繼承方式有:   public、private、protected三種(它們直接影響到派生類的成員、及其物件對基類成員訪問的規則)。  (1)public(公有繼承):繼承時保持基類中各成員屬性不變,並且基類中private成員被隱藏。派生類的成員只能訪問基類中的

類的繼承方式的訪問許可權.

    每次寫類需要用到繼承關係的時候我都習慣性的用public,而有些時候用其它兩種繼承方式(保護繼承和私有繼承)還是比較方便的,但是自己但是就是想不起來用,看到別人用它而設計出的類機構很好的時候遊羨慕不已,我以前學習C++的時候也注意過這兩種繼承方式各個區域(public

繼承(派生類的繼承方式,多重繼承,虛繼承

  繼承性是面向物件程式設計的第二大特性,它允許在既有類的基礎上建立新類,新類可以繼承既有類的資料成員和成員函式,可以新增自己特有的資料成員和成員函式,還可以對既有類中的成員函式重新定義。利用類的繼承和派生實現了更高層次的程式碼可重用性,符合現代軟體開發的思想。    

JS編碼方式(escape,encodeURI,encodeURIComponent)

一 參考書 1  js編碼http://blog.csdn.net/cnartstorm/archive/2009/06/23/4292460.aspx2 js 解決中文亂碼函式-js中escape,encodeURI,encodeURIComponent三個函式的區別 h

繼承方式訪問許可權的相互組合

        對基類進行繼承時,三種繼承方式下,基類的三種訪問許可權在子類中會有如何的變化這個問題,本科時上C++這門課的時候曾仔細的分析並弄得挺清楚,後來時間久了、用的也不多,慢慢的又變得心裡不太有譜了。這次接著準備面試的契機,又重新仔細分析了一番,留個案底,以免再犯糊塗

繼承方式

1、關於公有繼承,子類的物件可以直接訪問基類的公有的函式或者變數。 基類成員對派生類的可見性對派生類來說,基類的公有成員和保護成員可見,基類的公有成員和保護成員作為派生類的成員時,他們保持原有狀態,基類的私有成員不可見,基類的私有成員仍然是私有的,派生類不可以訪問基類的私

JS 之函式定義 & 建立物件 方式

JS函式建立三種方式 JS建立物件三種方式 一、javaScript 函式建立的三種方式 <html> <head> <meta http-equiv="Content-Type" content="text/htm

js面向物件基本理解和建立方式

面向物件的語言有一個標誌,那就是他們都有類的概念,通過類可以建立任意多個具有相同屬性和方法的物件。 但是在ECMAScript中沒有類的概念,但是我們可以通過其他方式來模擬面向物件的類。 工廠模式:工廠模式是軟體工廠領域中一種廣為人知的設計模式。 建構函式模式:比如像ECM

js oop中的繼承方法

custom 屬性方法 三種 調用方法 定義 this指向 兩個類 fun color JS OOP 中的三種繼承方法: 很多讀者關於js opp的繼承比較模糊,本文總結了oop中的三種繼承方法,以助於讀者進行區分。 <繼承使用一個子類繼承另一個父類,子類可以自

js學習總結----深入擴展原型鏈模式常用的六繼承方式

模式 temp 枚舉 又是 reat 缺點 解決 his obj 一、可枚舉和不可枚舉 for in 循環在遍歷的時候,默認的話可以把自己私有的和它所屬類原型上的擴展的屬性和方法都可以遍歷到,但是一般情況下,我們遍歷一個對象只需要遍歷私有的即可,我們可以使用以下的判斷進行處