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

資訊專欄INFORMATION COLUMN

js創(chuàng)建對(duì)象方法與過(guò)程+ES6的class

GitChat / 772人閱讀

摘要:改進(jìn)方法方法一通過(guò)先執(zhí)行一次的原型重寫寫在創(chuàng)建對(duì)象之前輸出方法二提前先執(zhí)行一次初次運(yùn)行時(shí),多調(diào)用一次輸出中的相當(dāng)于中的構(gòu)造函數(shù),如果不寫默認(rèn)為空,定義在對(duì)象自身上面該方法定義在上輸出可以說(shuō),用法就是中動(dòng)態(tài)原型模式。

js創(chuàng)建對(duì)象有很多方法,以下是常見方法整理。

ES5創(chuàng)建對(duì)象 工廠模式
function person (name, age, sex) {
    var O = new Object();
    O.name = name;
    O.age = age;
    O.sex = sex;
    O.sayName =function(){
        console.log(this.name);
    }
    return O;
}
var per = person("per",10,"male"); //不需要用new,因?yàn)橛衦eturn,就是個(gè)普通函數(shù),很好理解
console.log(per instanceof person); //false
構(gòu)造函數(shù)模式
function Person (name, age, sex) {
    this.name = name;
    this.age = age;
    this.sex = sex;
    this.sayName =function(){
        console.log(this.name);
    }
}
var per =new Person("per",10,"male"); 
console.log(per instanceof Person); //true

分析創(chuàng)建過(guò)程,

 var per =new Person("per",10,"male"); 

在這行代碼執(zhí)行時(shí),四個(gè)步驟:
①出現(xiàn)了一個(gè)空的對(duì)象
②this指向這個(gè)對(duì)象
③執(zhí)行構(gòu)造函數(shù)的代碼
④把這個(gè)對(duì)象取個(gè)名字是per,per的指針就指向這個(gè)對(duì)象,于是可以通過(guò)per操作這個(gè)對(duì)象

工廠模式定義出的對(duì)象,instanceof識(shí)別不出是"person類"。
構(gòu)造函數(shù)模式,每次new一個(gè)對(duì)象,里面的函數(shù)都會(huì)創(chuàng)建一次,就這個(gè)sayName函數(shù),明明共有同一個(gè)就可以了。
解決這個(gè)問(wèn)題,出現(xiàn)了原型模式:

原型模式
function Person () {
    Person.prototype.name = "p1";
    Person.prototype.age = 10;
    Person.prototype.sex = "female";
    Person.prototype.sayName =function(){
        console.log(this.name);
    }
}

那么,這些代碼干了什么呢?
①當(dāng)你創(chuàng)建Person()函數(shù)后,就會(huì)有一個(gè)prototype屬性隨之而來(lái)
我們可以看看,這個(gè)prototype是什么,執(zhí)行以下代碼:

 console.log(Person.prototype);

_proto_保存繼承自O(shè)bject的方法。里面只有一個(gè)constructor屬性指向Person()函數(shù)自身。
②當(dāng)然我們是要用這個(gè)函數(shù)的,執(zhí)行以下代碼:

var per1 =new Person();
var per2 =new Person();
console.log(Person.prototype);

在創(chuàng)建實(shí)際對(duì)象時(shí)候,就會(huì)運(yùn)行構(gòu)造函數(shù)中的代碼,而且per1、per2兩個(gè)對(duì)象,就會(huì)執(zhí)行兩次構(gòu)造函數(shù)的代碼,但并不會(huì)多創(chuàng)建一個(gè)Person的prototype屬性,只是重新賦值里面的name、age、sex和sayName變量。
③per1和per2有各自的prototype屬性,指向Person的prototype屬性。可以簡(jiǎn)單理解為per1、per2各自的"指針"指向同一個(gè)"對(duì)象"。

這個(gè)原型模式啊,就真的好像單例模式了,每個(gè)創(chuàng)建的對(duì)象都在操作同一個(gè)對(duì)象。

最優(yōu):動(dòng)態(tài)原型模式
function Person (name, age, sex) {
    this.name = name;
    this.age = age;
    this.sex = sex;
    if(typeof this.sayName != "function"){  
        Person.prototype.sayName = function(){
            console.log(this.name);
        }
        Person.prototype.sayAge = function(){
            console.log(this.age);
        }
    }
}
var per = new Person("wlq", 19, "man");

這樣的代碼,使得每個(gè)對(duì)象的name、age、sex都是各自的(不共有),然后函數(shù)寫在原型上,就又是共享的,很不錯(cuò)。還有個(gè)地方,if語(yǔ)句的判斷,使得第二次創(chuàng)建對(duì)象時(shí)候,不會(huì)重新給Person.prototype.sayName和Person.prototype.sayAge重賦值。

原型重寫的問(wèn)題
function Person (name, age, sex) {
    this.name = name;
    this.age = age;
    this.sex = sex;
    if(typeof this.sayName != "function"){
        Person.prototype.sayName = function(){
            console.log(this.name);
        }
    }
}
function WPerson (name, age, sex) {
    this.name = name;
    this.age = age;
    this.sex = sex;
    if(typeof this.sayName != "function"){
        WPerson.prototype = {   //這里進(jìn)行了原型的重寫
            constructor: WPerson,
            sayName: function(){
                console.log(this.name);
            }
        }
    }
}
var per1 = new Person("w", 19, "man");
var per2 = new WPerson("q", 18, "man");
var per3 = new WPerson("q", 18, "man");
per1.sayName();  //輸出w
per2.sayName();  //報(bào)錯(cuò),說(shuō)沒有sayName這個(gè)方法
per3.sayName();  //輸出q
console.log(per2.name);  //輸出q
原因

重寫原型的發(fā)生是在創(chuàng)建對(duì)象之后的,per2指向的WPerson的原型上面只有name、age、sex,再創(chuàng)建完per2后,才執(zhí)行WPerson原型的重寫,per3甚至以后創(chuàng)建的WPerson類型對(duì)象就都會(huì)有sayName函數(shù)了。

改進(jìn)方法

方法一(通過(guò)先執(zhí)行一次WPerson的原型重寫):

function WPerson (name, age, sex) {
    this.name = name;
    this.age = age;
    this.sex = sex;       
}
WPerson.prototype = {  //寫在創(chuàng)建對(duì)象之前
    constructor:WPerson,
    sayName: function(){
        console.log(this.name);
    }
}
var per = new WPerson("q", 18, "man");
per.sayName();  //輸出q

方法二(提前先執(zhí)行一次new):

   function WPerson (name, age, sex) {
        this.name = name;
        this.age = age;
        this.sex = sex;  
        if(typeof this.sayName != "function"){
            WPerson.prototype = {  
                constructor:WPerson,
                sayName: function(){
                    console.log(this.name);
                }
            };
            return new WPerson(name,age,sex);  //初次運(yùn)行時(shí),多調(diào)用一次new
           }
    }     
    var per = new WPerson("q", 18, "man");
    per.sayName();  //輸出q
   

ES6中的class
class Point{
  constructor(x, y) {    //相當(dāng)于java中的構(gòu)造函數(shù),如果不寫默認(rèn)為空
    this.x = x;          //x,y定義在對(duì)象自身上面
    this.y = y;
  }
  add() {                //該方法定義在Point.prototype上
    console.log(this.x + this.y);
  }
}
var p = new Point(2, 3);
p.add();  //輸出5

可以說(shuō),class用法就是ES5中動(dòng)態(tài)原型模式。

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

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

相關(guān)文章

  • es6js

    摘要:生成的類的原型會(huì)被自動(dòng)調(diào)整,而你還能調(diào)用方法來(lái)訪問(wèn)基類的構(gòu)造器。唯一能避免調(diào)用的辦法,是從類構(gòu)造器中返回一個(gè)對(duì)象。 起源 JS 從創(chuàng)建之初就不支持類,也沒有把類繼承作為定義相似對(duì)象以及關(guān)聯(lián)對(duì)象的主要方式,這讓不少開發(fā)者感到困惑。而從 ES1 誕生之前直到ES5 時(shí)期,很多庫(kù)都創(chuàng)建了一些工具,讓 JS 顯得貌似能支持類。盡管一些 JS 開發(fā)者強(qiáng)烈認(rèn)為這門語(yǔ)言不需要類,但為處理類而創(chuàng)建的代...

    libin19890520 評(píng)論0 收藏0
  • JavaScript面向對(duì)象核心知識(shí)歸納

    摘要:一面向?qū)ο蟾拍蠲嫦驅(qū)ο缶褪鞘褂脤?duì)象。因此在構(gòu)造函數(shù)中表示剛剛創(chuàng)建出來(lái)的對(duì)象。在構(gòu)造函數(shù)中利用對(duì)象的動(dòng)態(tài)特性為其對(duì)象添加成員。 一、面向?qū)ο?1.1 概念 面向?qū)ο缶褪鞘褂脤?duì)象。面向?qū)ο箝_發(fā)就是使用對(duì)象開發(fā)。 面向過(guò)程就是用過(guò)程的方式進(jìn)行開發(fā)。面向?qū)ο笫菍?duì)面向過(guò)程的封裝。 1.2 三大特性 抽象性所謂的抽象性就是:如果需要一個(gè)對(duì)象描述數(shù)據(jù),需要抽取這個(gè)對(duì)象的核心數(shù)據(jù) 提出需要的核心...

    TalkingData 評(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ì)象(沒有類的概念)的語(yǔ)言,從入門到精通到放棄一直會(huì)被對(duì)象這個(gè)問(wèn)題圍繞。 平時(shí)發(fā)的文章基本都是開發(fā)中遇到的問(wèn)題和對(duì)...

    CatalpaFlat 評(píng)論0 收藏0
  • 剖析JS原型鏈和繼承

    摘要:接下來(lái)我們來(lái)聊一下的原型鏈繼承和類。組合繼承為了復(fù)用方法,我們使用組合繼承的方式,即利用構(gòu)造函數(shù)繼承屬性,利用原型鏈繼承方法,融合它們的優(yōu)點(diǎn),避免缺陷,成為中最常用的繼承。 JavaScript是一門面向?qū)ο蟮脑O(shè)計(jì)語(yǔ)言,在JS里除了null和undefined,其余一切皆為對(duì)象。其中Array/Function/Date/RegExp是Object對(duì)象的特殊實(shí)例實(shí)現(xiàn),Boolean/N...

    darkerXi 評(píng)論0 收藏0
  • JS之理解ES6 繼承extends

    摘要:理解繼承在中對(duì)繼承有了更友好的方式。總的來(lái)說(shuō)的的實(shí)質(zhì)和以前的繼承方式是一致的,但是有了更好的,更清晰的表現(xiàn)形式。 理解ES6繼承extends 1.在es6中對(duì)繼承有了更友好的方式。在下面的繼承中那到底在extends的時(shí)候做了什么,super()又是代表什么意思。 class People{ constructor(name, age) { this.name = name; ...

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

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

0條評(píng)論

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