js---16繼承

來源:互聯網
上載者:User

標籤:建立   這一   函數對象   推薦   --   ati   func   tor   base   

123 instanceof Number;//false,要左邊是對象右邊是函數typeof 123 ; //numbernew Number(123) instanceof Number; //true    function F(){};var f = new F();f instanceof F ; //truef instanceof Object ; //true  //建立父類 //建立子類 //建立關係function  P () {}function C(){}//1.繼承,P是父C是子C.prototype = P.prototype;// C使用P的公有地區C.prototype.constructor;//   function  P ()var c1 = new C();c1 instanceof C;//truec1 instanceof P ;//trueC.prototype.xxx = "xxx";//給C增加屬性c1.xxx;//"xxx",首先去c1自己裡面去找,沒有找到,就是原型對象裡面去找。var p1 = new P();p1.xxx; //"xxx",父也可以使用子的東西了,所以這種方式強烈不推薦//2.p是父c是子C.prototype = new P();var c1 = new C();c1 instanceof C;//truec1 instanceof P ;//trueC.prototype.xxx = "xxx";//給C增加屬性c1.xxx;//"xxx"var p1 = new P();p1.xxx; //undefined,父類不可以使用子類的東西了,缺點是平白無故new了一個P(),增加了記憶體,不推薦//3. 推薦寫法/*function F();F.prototype = P.prototype;var f = new F();C.prototype = f;  //C的prototype指向一個對象,這個對象所在函數的prototype等於父類函數的prototype*/C.prototype = Object.create(P.prototype);C.prototype;//Object{},create()方法實現了繼承,但是原型對象沒有修正============================================================function Person(name,age){//父類    this.name = name;    this.age = age;//這些屬性是變數各自都有的,各自修改互不影響,}Person.prototype.headCount = 1;//父類的原型的屬性,這跟java對應不上,Person.prototype.eat = function() {//父類的原型的方法    console.log("eating...");};function Programmer(name,age,title){//子類    Person.apply(this,arguments);}Programmer.prototype.language = "javascript";Programmer.prototype.work = function(){    console.log("i am writing code in " + this.language);//this是對象,可以訪問原型裡面的屬性    }Programmer.prototype = Object.create(Person.prototype); //Programmer繼承了PersonProgrammer.prototype.constructor = Programmer;var java = new Programmer();java.eat();//eating...java.language;//undefined,Programmer.prototype = Object.create(Person.prototype); 把Programmer的原型全部改了,之前寫的原型裡面的屬性沒了,所以之前寫的原型的代碼(Programmer.prototype.language,Programmer.prototype.work)要寫到後面來,Programmer.prototype.language = "javascript";Programmer.prototype.work = function(){    console.log("i am writing code in " + this.language);//this是對象,可以訪問原型裡面的屬性}java.language;//javascript==========================================================================function Person(name,age){//父類    this.name = name;    this.age = age; }Person.prototype.headCount = 1; Person.prototype.eat = function() {     console.log("eating...");};function Programmer(name,age,title){    Person.apply(this,arguments);//讓Programmer擁有name,age屬性}//繼承createEx(Programmer,Person);Programmer.prototype.language = "javascript";Programmer.prototype.work = function(){    console.log("i am writing code in " + this.language);    Programmer.base.eat();}function createEx(Child,Parent){    function F(){};//建立一個函數作為中間的橋接    F.prototype = Parent.prototype;    Child.prototype = new F();    Child.prototype.constructor = Child;    Child.super = Child.base = Parent.prototype;}var java = new Programmer();java.headCount;//1java.work();// am writing code in javascriptvar person = new Person("cj",22);person.name;//cjvar p = new Programmer("dacid",33,"ddd");p.name;//davidperson.name = "xxx";p.name;//dacid ,  父類子類對象的相同屬性不影響   ,函數的嵌套好像不會產生繼承,只是閉包有繼承。

 

 

//js裡面的複製也是繼承,深拷貝淺拷貝問題,應為複製過來以後可以自己加/*js裡面的構造器函數和原型prototype共同形成了類。var f = new F();  這一步只是把F函數裡面的屬性this.name、this.age變成了F函數對象的執行個體成員,使得每一個對象都有name、age屬性。f.__proto__ = F.prototype = Parent.prototype;才有繼承了。//js的繼承就是要函數的原型建立關係。

 

js---16繼承

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.