国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

constructor, prototype, __proto__ 詳解

lifesimple / 642人閱讀

摘要:接下解釋和屬性同樣拿上面的代碼來(lái)解釋輸出首先給構(gòu)造函數(shù)的原型對(duì)象賦給方法,由構(gòu)造函數(shù)創(chuàng)建的實(shí)例會(huì)繼承原型對(duì)象上的方法。

本文為了解決以下問(wèn)題:

__proto__(實(shí)際原型)和prototype(原型屬性)不一樣!!!

constructor屬性(原型對(duì)象中包含這個(gè)屬性,實(shí)例當(dāng)中也同樣會(huì)繼承這個(gè)屬性)

prototype屬性(constructor.prototype原型對(duì)象)

__proto__屬性(實(shí)例指向原型對(duì)象的指針)

首先弄清楚幾個(gè)概念:

什么是對(duì)象

若干屬性的集合

什么是原型?

原型是一個(gè)對(duì)象,其他對(duì)象可以通過(guò)它實(shí)現(xiàn)繼承。

哪些對(duì)象有原型?

所有的對(duì)象在默認(rèn)情況下都有一個(gè)原型,因?yàn)樵捅旧硪彩菍?duì)象,所以每個(gè)原型自身又有一個(gè)原型(只有一種例外,默認(rèn)的對(duì)象原型在原型鏈的頂端)

任何一個(gè)對(duì)象都可以成為原型

接下來(lái)就是最核心的內(nèi)容:

constructor 屬性

constructor屬性始終指向創(chuàng)建當(dāng)前對(duì)象的構(gòu)造函數(shù)。

    var arr=[1,2,3];
    console.log(arr.constructor); //輸出 function Array(){}
    var a={};
    console.log(arr.constructor);//輸出 function Object(){}
    var bool=false;
    console.log(bool.constructor);//輸出 function Boolean(){}
    var name="hello";
    console.log(name.constructor);//輸出 function String(){}
    var sayName=function(){}
    console.log(sayName.constrctor)// 輸出 function Function(){}
    
    //接下來(lái)通過(guò)構(gòu)造函數(shù)創(chuàng)建instance
    function A(){}
    var a=new A();
    console.log(a.constructor); //輸出 function A(){}

以上部分即解釋了任何一個(gè)對(duì)象都有constructor屬性,指向創(chuàng)建這個(gè)對(duì)象的構(gòu)造函數(shù)

prototype屬性

注意:prototype是每個(gè)函數(shù)對(duì)象都具有的屬性,被稱為原型對(duì)象,而__proto__屬性才是每個(gè)對(duì)象才有的屬性。一旦原型對(duì)象被賦予屬性和方法,那么由相應(yīng)的構(gòu)造函數(shù)創(chuàng)建的實(shí)例會(huì)繼承prototype上的屬性和方法

    //constructor : A
    //instance : a
    function A(){}
    var a=new A();

    A.prototype.name="xl";
    A.prototype.sayName=function(){
        console.log(this.name);
    }
    
    console.log(a.name);// "xl"
    a.sayName();// "xl"
    
    //那么由constructor創(chuàng)建的instance會(huì)繼承prototype上的屬性和方法
constructor屬性和prototype屬性

每個(gè)函數(shù)都有prototype屬性,而這個(gè)prototypeconstructor屬性會(huì)指向這個(gè)函數(shù)。

    function Person(name){
        this.name=name;
    }
    Person.prototype.sayName=function(){
        console.log(this.name);
    }
    
    var person=new Person("xl");
    
    console.log(person.constructor); //輸出 function Person(){}
    console.log(Person.prototype.constructor);//輸出 function Person(){}
    console.log(Person.constructor); //輸出 function Function(){}

如果我們重寫(重新定義)這個(gè)Person.prototype屬性,那么constructor屬性的指向就會(huì)發(fā)生改變了。

    Person.prototype={
        sayName:function(){
            console.log(this.name);
        }
    }
    
    console.log(person.constructor==Person); //輸出 false (這里為什么會(huì)輸出false后面會(huì)講)
    console.log(Person.constructor==Person); //輸出 false
    
    console.log(Person.prototype.constructor);// 輸出 function Object(){}  
    //這里為什么會(huì)輸出function Object(){}
    //還記得之前說(shuō)過(guò)constructor屬性始終指向創(chuàng)建這個(gè)對(duì)象的構(gòu)造函數(shù)嗎?
    
    Person.prototype={
        sayName:function(){
            console.log(this.name);
        }
    }
    //這里實(shí)際上是對(duì)原型對(duì)象的重寫:
    Person.prototype=new Object(){
        sayName:function(){
            console.log(this.name);
        }
    }
    //看到了吧。現(xiàn)在Person.prototype.constructor屬性實(shí)際上是指向Object的。
    
    //那么我如何能將constructor屬性再次指向Person呢?
    Person.prototype.constructor=Person;

接下來(lái)解釋為什么,看下面的例子

    function Person(name){
        this.name = name;
    }
    
    var personOne=new Person("xl");
    
    Person.prototype = {
        sayName: function(){
            console.log(this.name);
        }
    };
    
    var personTwo = new Person("XL");
    
    console.log(personOne.constructor == Person); //輸出true
    console.log(personTwo.constructor == Person); //輸出false   
    //大家可能會(huì)對(duì)這個(gè)地方產(chǎn)生疑惑?為何會(huì)第二個(gè)會(huì)輸出false,personTwo不也是由Person創(chuàng)建的嗎?這個(gè)地方應(yīng)該要輸出true啊?
    //這里就涉及到了JS里面的原型繼承
    //這個(gè)地方是因?yàn)閜erson實(shí)例繼承了Person.prototype原型對(duì)象的所有的方法和屬性,包括constructor屬性。當(dāng)Person.prototype的constructor發(fā)生變化的時(shí)候,相應(yīng)的person實(shí)例上的constructor屬性也會(huì)發(fā)生變化。所以第二個(gè)會(huì)輸出false;
    //當(dāng)然第一個(gè)是輸出true,因?yàn)楦淖儤?gòu)造函數(shù)的prototype屬性是在personOne被創(chuàng)建出來(lái)之后。

接下解釋__proto__prototype屬性
同樣拿上面的代碼來(lái)解釋:

    function Person(name){
        this.name=name;
    }
    Person.prototype.sayName=function(){
        console.log(this.name);
    }
    var person=new Person("xl");
    person.sayName(); //輸出 "xl"

    //constructor : Person
    //instance : person
    //prototype : Person.prototype

首先給構(gòu)造函數(shù)的原型對(duì)象Person.prototype賦給sayName方法,由構(gòu)造函數(shù)Person創(chuàng)建的實(shí)例person會(huì)繼承原型對(duì)象上的sayName方法。

為什么會(huì)繼承原型對(duì)象的方法?

因?yàn)镋CMAscript的發(fā)明者為了簡(jiǎn)化這門語(yǔ)言,同時(shí)又保持繼承性,采用了鏈?zhǔn)嚼^承的方法。

constructor創(chuàng)建的每個(gè)instance都有個(gè)__proto__屬性,它指向constructor.prototype。那么constrcutor.prototype上定義的屬性和方法都會(huì)被instance所繼承.

    function Person(name){
        this.name=name;
    }
    Person.prototype.sayName=function(){
        console.log(this.name);
    }
    
    var personOne=new Person("a");
    var personTwo=new Person("b");
    
    personOne.sayName(); // 輸出  "a"
    personTwo.sayName(); //輸出 "b"
    
    console.log(personOne.__proto__==Person.prototype); // true
    console.log(personTwo.__proto__==Person.prototype); // true
    
    console.log(personOne.constructor==Person); //true
    console.log(personTwo.constructor==Person); //true
    console.log(Person.prototype.constructor==Person); //true
    
    console.log(Person.constructor); //function Function(){}
    console.log(Person.__proto__.__proto__); // Object{} 

參考文章:

強(qiáng)大的原型和原型鏈

js原型鏈看圖說(shuō)明

理解javascript原型

javascript類和繼承:constructor

javascript探秘:構(gòu)造函數(shù)

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/85836.html

相關(guān)文章

  • 【JS基礎(chǔ)】Object 對(duì)象的原型概念詳解

    摘要:使用操作符,創(chuàng)建一個(gè)對(duì)象,并且執(zhí)行構(gòu)造函數(shù)方法。使用可以返回一個(gè)字典型對(duì)象對(duì)象原型每一個(gè)對(duì)象都有一個(gè)內(nèi)置的屬性指向構(gòu)造它的函數(shù)屬性而構(gòu)造函數(shù)的則指向構(gòu)造函數(shù)本生。 對(duì)象概念 在 javascript 中, 一切引用類型均為對(duì)象。 如 function Foo () {} 中,F(xiàn)oo本身就是一個(gè)對(duì)象的引用。 創(chuàng)建對(duì)象方式 字面量方式 new 構(gòu)造函數(shù) 函數(shù)聲明 Object.creat...

    appetizerio 評(píng)論0 收藏0
  • 【前端基礎(chǔ)進(jìn)階】JS原型、原型鏈、對(duì)象詳解

    摘要:二構(gòu)造函數(shù)我們先復(fù)習(xí)一下構(gòu)造函數(shù)的知識(shí)上面的例子中和都是的實(shí)例。這兩個(gè)實(shí)例都有一個(gè)構(gòu)造函數(shù)屬性,該屬性是一個(gè)指針指向。原型鏈其中是對(duì)象的實(shí)例。 一. 普通對(duì)象與函數(shù)對(duì)象 JavaScript 中,萬(wàn)物皆對(duì)象!但對(duì)象也是有區(qū)別的。分為普通對(duì)象和函數(shù)對(duì)象,Object 、Function 是 JS 自帶的函數(shù)對(duì)象。下面舉例說(shuō)明 var o1 = {}; var o2 =new Objec...

    explorer_ddf 評(píng)論0 收藏0
  • JavaScript學(xué)習(xí)總結(jié)(五)原型和原型鏈詳解

    摘要:原型對(duì)象內(nèi)部也有一個(gè)指針屬性指向構(gòu)造函數(shù)實(shí)例可以訪問(wèn)原型對(duì)象上定義的屬性和方法。在創(chuàng)建子類型的實(shí)例時(shí),不能向超類型的構(gòu)造函數(shù)中傳遞參數(shù)。 贊助我以寫出更好的文章,give me a cup of coffee? 2017最新最全前端面試題 私有變量和函數(shù) 在函數(shù)內(nèi)部定義的變量和函數(shù),如果不對(duì)外提供接口,外部是無(wú)法訪問(wèn)到的,也就是該函數(shù)的私有的變量和函數(shù)。 function ...

    EscapedDog 評(píng)論0 收藏0
  • 詳解ES6中的class——基本概念

    摘要:歡迎關(guān)注前端小謳的,閱讀更多原創(chuàng)技術(shù)文章用構(gòu)造函數(shù),生成對(duì)象實(shí)例使用構(gòu)造函數(shù),并且構(gòu)造函數(shù)后臺(tái)會(huì)隱式執(zhí)行創(chuàng)建對(duì)象將構(gòu)造函數(shù)的作用域給新對(duì)象,即創(chuàng)建出的對(duì)象,函數(shù)體內(nèi)的代表出來(lái)的對(duì)象執(zhí)行構(gòu)造函數(shù)的代碼返回新對(duì)象后臺(tái)直接返回用改寫上述代碼通過(guò)關(guān) 歡迎關(guān)注前端小謳的github,閱讀更多原創(chuàng)技術(shù)文章 用構(gòu)造函數(shù),生成對(duì)象實(shí)例: 使用構(gòu)造函數(shù),并且new 構(gòu)造函數(shù)(), 后臺(tái)會(huì)隱式執(zhí)行ne...

    mengera88 評(píng)論0 收藏0
  • javaScript原型及原型鏈詳解(一)

    摘要:執(zhí)行行代碼,我們可以看到控制臺(tái)打印出來(lái)的結(jié)果如下結(jié)果印證了我們上面講的內(nèi)容指向的構(gòu)造函數(shù)指向的原型對(duì)象原型對(duì)象中指向構(gòu)造函數(shù)。 在javascript中原型和原型鏈機(jī)制是最難懂的部分(沒(méi)有之一),同時(shí)也是最重要的部分,在學(xué)習(xí)的過(guò)程中你可能認(rèn)認(rèn)真真的看了一遍但還是完全不懂書上說(shuō)的什么,的確是這樣的,我在學(xué)習(xí)的時(shí)候可是反復(fù)看了4、5遍才初步理解了。 下面我把我的理解總結(jié)了一下希望對(duì)你們有...

    springDevBird 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

lifesimple

|高級(jí)講師

TA的文章

閱讀更多
最新活動(dòng)
閱讀需要支付1元查看
<