成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

JS基礎(chǔ)(對(duì)象創(chuàng)建,構(gòu)造函數(shù)、原型、實(shí)例之間關(guān)系,繼承方式)

PAMPANG / 3203人閱讀

摘要:對(duì)象創(chuàng)建的三種方式字面量創(chuàng)建方式系統(tǒng)內(nèi)置構(gòu)造函數(shù)方式自定義構(gòu)造函數(shù)構(gòu)造函數(shù)原型實(shí)例之間的關(guān)系實(shí)例是由構(gòu)造函數(shù)實(shí)例化創(chuàng)建的,每個(gè)函數(shù)在被創(chuàng)建的時(shí)候,都會(huì)默認(rèn)有一個(gè)對(duì)象。

JS 對(duì)象創(chuàng)建的三種方式
//字面量創(chuàng)建方式
var person= { name:"jack" }

//系統(tǒng)內(nèi)置構(gòu)造函數(shù)方式
var person= new Object();
person.name = "jack";

//自定義構(gòu)造函數(shù)
function Person(name){
    this.name = name;
}
var person = new Person("jack");
JS 構(gòu)造函數(shù)、原型、實(shí)例之間的關(guān)系

  實(shí)例是由構(gòu)造函數(shù)實(shí)例化創(chuàng)建的,每個(gè)函數(shù)在被創(chuàng)建的時(shí)候,都會(huì)默認(rèn)有一個(gè)prototype對(duì)象。該對(duì)象就是構(gòu)造函數(shù)的原型,并且原型對(duì)象中還有一個(gè)constructor屬性,指向的是原型所在的構(gòu)造函數(shù)。

在每一個(gè)實(shí)例對(duì)象中的__proto__中同時(shí)有一個(gè) constructor 屬性,該屬性指向創(chuàng)建該實(shí)例的構(gòu)造函數(shù)。

構(gòu)造函數(shù)的 prototype對(duì)象默認(rèn)都有一個(gè) constructor 屬性,指向 prototype 對(duì)象所在函數(shù)。

(圖片原址:https://www.oecom.cn/the-rela...)

值類型成員或者引用類型成員寫(xiě)入(實(shí)例對(duì)象.成員 = xx):

當(dāng)實(shí)例期望重寫(xiě)原型對(duì)象中的某個(gè)普通數(shù)據(jù)成員時(shí)實(shí)際上會(huì)把該成員添加到自己身上,

也就是說(shuō)該行為實(shí)際上會(huì)屏蔽掉對(duì)原型對(duì)象成員的訪問(wèn)

復(fù)雜類型修改(實(shí)例對(duì)象.成員.xx = xx):

同樣會(huì)先在自己身上找該成員,如果自己身上找到則直接修改,

如果自己身上找不到,則沿著原型鏈繼續(xù)查找,如果找到則修改,

如果一直到原型鏈的末端還沒(méi)有找到該成員,則報(bào)錯(cuò)(實(shí)例對(duì)象.undefined.xx = xx)。

JS 構(gòu)造函數(shù)常用用法
function Person( name,age,job){
    this.name = name;
    this.age = age;
    this.job = job;
}

Person.prototype = {
    constructor:Person, //修正,指向正確的構(gòu)造函數(shù)
    introduce:function(){
        console.log("hello,everybody. my name is"+ this.name +"
")
    }
}  

不需要共享的數(shù)據(jù)寫(xiě)在構(gòu)造函數(shù)中,需要共享的數(shù)據(jù)寫(xiě)在原型中。

實(shí)例對(duì)象使用的屬性或者方法,先在實(shí)例中查找,找到了則直接使用,找不到則,去實(shí)例對(duì)象的__proto__指向的原型對(duì)象prototype中找,找到了則使用,找不到則報(bào)錯(cuò)。

原型鏈:是一種關(guān)系,實(shí)例對(duì)象和原型對(duì)象之間的關(guān)系,關(guān)系是通過(guò)原型(__proto__)來(lái)聯(lián)系的

JS 封裝、繼承、多態(tài)

  面向?qū)ο蟮木幊陶Z(yǔ)言中有類的概念,而JS是基于對(duì)象的語(yǔ)言,JS中沒(méi)有類,但是JS可以模擬面向?qū)ο蟮乃枷刖幊?,JS通過(guò)構(gòu)造函數(shù)模擬類的概念。

封裝:一系列屬性放在對(duì)象中或者一系列實(shí)現(xiàn)某種功能的方法放在對(duì)象,就是封裝。
繼承:繼承屬于類與類之間的關(guān)系,JS通過(guò)構(gòu)造函數(shù)模擬類,通過(guò)原型來(lái)實(shí)現(xiàn)繼承,繼承的目的是為了實(shí)現(xiàn)數(shù)據(jù)共享。
多態(tài):一個(gè)對(duì)象有不同的行為,或者同一個(gè)行為針對(duì)不同的對(duì)象,產(chǎn)生不同的結(jié)果,要想有多態(tài),就要先有繼承,JS中可以模擬多態(tài)。
JS 繼承方式 借用構(gòu)造函數(shù)繼承:構(gòu)造函數(shù)的名字.call( 當(dāng)前對(duì)象,屬性,屬性....)

解決了屬性繼承問(wèn)題,但是不能繼承父級(jí)的方法?! ?/p>

function Person(name,age){
    this.name = name;
    this.age = age;
}

function Student(name,age,score) {
    Person.call(this,name,age);
    this.score = score;
}

var Ming = new Student("小明","18","100");
組合繼承:原型繼承 + 借用構(gòu)造函數(shù)繼承 
function Person(name,age){
    this.name = name;
    this.age = age;
}

Person.prototype.introduce = function(){
    console.log("hello,everybody,my name is " + this.name);
}

function Student(name,age,score) {
    Person.call(this,name,age);
    this.score = score;
}

Student.prototype = new Person();
var Ming = new Student("小明","18","100");
寄生組合繼承:寄生式繼承 + 借用構(gòu)造函數(shù)繼承 
function inheritObject(o){
    function F(){};
    F.prototype = o;
    return new F();
}
function inheritPrototype(subclass,superclass){
    var p = inheritObject(superclass.prototype);
    p.constructor = subclass;
    subclass.prototype = p;
}

//定義父類
function SuperClass(name){
    this.name = name;
    this.colors = [red,blue]
}
SuperClass.prototype.getName = function(){
    console.log(this.name);
}    
//定義子類
function SubClass(name,time){
    //構(gòu)造函數(shù)式繼承
    SuperClass.call(this,name);
    this.time = time;
}
//寄生式繼承父類原型
inheritPrototype(SubClass,SuperClass);
//子類新增原型方法
SubClass.prototype.getTime = function(){
    console.log(this.time);
}
模擬多繼承: 
Object.prototype.mix = function(){
    var i = 0,                //從第一個(gè)參數(shù)起為被繼承對(duì)象
        len = arguments.length,   //獲取參數(shù)長(zhǎng)度
        arg;                  //緩存參數(shù)對(duì)象
    for(;i < len; i++){
        //緩存當(dāng)前對(duì)象
        arg = arguments[i];
        for(var property in arg){
            this[property] = arg[property];
        }
    }
}

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

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/108957.html

相關(guān)文章

  • JS基礎(chǔ)之?dāng)?shù)據(jù)類型、對(duì)象、原型原型鏈、繼承

    摘要:就是通過(guò)調(diào)用構(gòu)造函數(shù)而創(chuàng)建的那個(gè)對(duì)象實(shí)例的原型對(duì)象。構(gòu)造函數(shù)模式可以創(chuàng)建自定義引用類型,可以像創(chuàng)建內(nèi)置對(duì)象實(shí)例一樣使用操作符。 數(shù)據(jù)類型: 簡(jiǎn)單數(shù)據(jù)類型:Undefined、Null、String、Number、Boolean、Symbol 復(fù)雜數(shù)據(jù)類型:Object // Undefined:聲明,但未初始化 // Null:空對(duì)象指針 typeof操作符(檢測(cè)基本數(shù)據(jù)類型): ...

    LucasTwilight 評(píng)論0 收藏0
  • 重溫JS基礎(chǔ)--繼承

    摘要:繼承了如上,我們通過(guò)方法借調(diào)了超類的構(gòu)造函數(shù),實(shí)際上是在新創(chuàng)建的實(shí)力環(huán)境下調(diào)用了構(gòu)造函數(shù)。組合繼承組合繼承的基本思想將原型鏈和借用構(gòu)造函數(shù)的技術(shù)組合到一塊,從而發(fā)揮二者之長(zhǎng)的一種繼承模式。繼承方法在上面這個(gè)例子中,構(gòu)造函數(shù)定義了兩個(gè)屬性和。 在ECMAScript中只支持實(shí)現(xiàn)繼承,而且實(shí)現(xiàn)繼承主要是依靠原型鏈來(lái)實(shí)現(xiàn)的。 1. 什么是原型鏈 繼承基本思想:利用原型讓一個(gè)引用類型繼承另一個(gè)...

    sixleaves 評(píng)論0 收藏0
  • js對(duì)象詳解(JavaScript對(duì)象深度剖析,深度理解js對(duì)象)

    摘要:對(duì)象詳解對(duì)象深度剖析,深度理解對(duì)象這算是醞釀很久的一篇文章了。用空構(gòu)造函數(shù)設(shè)置類名每個(gè)對(duì)象都共享相同屬性每個(gè)對(duì)象共享一個(gè)方法版本,省內(nèi)存。 js對(duì)象詳解(JavaScript對(duì)象深度剖析,深度理解js對(duì)象) 這算是醞釀很久的一篇文章了。 JavaScript作為一個(gè)基于對(duì)象(沒(méi)有類的概念)的語(yǔ)言,從入門(mén)到精通到放棄一直會(huì)被對(duì)象這個(gè)問(wèn)題圍繞。 平時(shí)發(fā)的文章基本都是開(kāi)發(fā)中遇到的問(wèn)題和對(duì)...

    CatalpaFlat 評(píng)論0 收藏0
  • js高級(jí)程序設(shè)計(jì)-面向對(duì)象的程序設(shè)計(jì)-閱讀筆記

    摘要:中又兩種屬性數(shù)據(jù)屬性包含一個(gè)數(shù)據(jù)值的位置叫做數(shù)據(jù)屬性和訪問(wèn)器屬性和就是訪問(wèn)器屬性數(shù)據(jù)屬性而數(shù)據(jù)屬性又有四個(gè)這樣的特性是否可配置編輯刪除屬性默認(rèn)是否可以被枚舉即可被默認(rèn)是否可寫(xiě)默認(rèn)寫(xiě)不代表刪除這里僅限修改屬性的數(shù)據(jù)值默認(rèn)是設(shè)置了一個(gè)空對(duì)象定 ECMAScript 中又兩種屬性:數(shù)據(jù)屬性(包含一個(gè)數(shù)據(jù)值的位置叫做數(shù)據(jù)屬性)和訪問(wèn)器屬性(getter() 和 setter()就是訪問(wèn)器屬性)...

    AlphaWatch 評(píng)論0 收藏0
  • 淺析JavaScript中原型及constructor、__proto__、prototype的關(guān)系

    摘要:搞清了構(gòu)造函數(shù)和原型的區(qū)別后,就可以繼續(xù)了。指向構(gòu)造函數(shù)的原型對(duì)象,存在于實(shí)例與構(gòu)造函數(shù)的原型對(duì)象之間。要注意的是當(dāng)我們使用下面這種將整個(gè)重寫(xiě)的情況時(shí),會(huì)切斷構(gòu)造函數(shù)和原型之間的聯(lián)系,也就是說(shuō)不再指向了,而是指向。 前言 先說(shuō)一說(shuō)為什么要搞清楚JavaScript的原型,因?yàn)檫@就是JS的根。JavaScript雖然不是一門(mén)傳統(tǒng)的面向?qū)ο笳Z(yǔ)言,但它有自己的類和繼承機(jī)制,最重要的就是它采用...

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

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

0條評(píng)論

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