成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專(zhuān)欄INFORMATION COLUMN

javascript創(chuàng)建對(duì)象方式

newsning / 1147人閱讀

摘要:枚舉對(duì)象上的實(shí)例屬性用方法原型模式優(yōu)缺點(diǎn)優(yōu)點(diǎn)不用每個(gè)方法都要在每個(gè)實(shí)例上重申一遍缺點(diǎn)很少有人多帶帶使用原型模式地。。組合使用構(gòu)造函數(shù)模式和原型模式這種模式是目前使用最廣泛認(rèn)同度最高的一種創(chuàng)建自定義類(lèi)型的方法。是用來(lái)定義引用類(lèi)型的一種默認(rèn)模式。

javascript創(chuàng)建對(duì)象方式

工廠(chǎng)模式

構(gòu)造函數(shù)模式

原型模式

工廠(chǎng)模式
    function createPerson(name, age){
        var obj = new Object();
        obj.name = name;
        obj.age = age;
        return obj; //一定要返回,否則打印undefined:undefined
    }
    var person1 = new createPerson("Young",18);
    console.log(person1.name + ":" + person1.age);

優(yōu)點(diǎn):工廠(chǎng)模式可以解決創(chuàng)建多個(gè)相似對(duì)象

缺點(diǎn):沒(méi)有解決對(duì)象識(shí)別問(wèn)題(怎樣確定一個(gè)對(duì)象的類(lèi)型)

學(xué)習(xí)判斷對(duì)象類(lèi)型: http://www.cnblogs.com/flyjs/...

構(gòu)造函數(shù)模式
    function Person(name,age){
      this.name = name;
      this.age = age;
    }
    var person1 = new Person("Young",18);
    console.log(person1.name + ":" + person1.age);

在說(shuō)優(yōu)缺點(diǎn)之前,先來(lái)說(shuō)說(shuō)她本身的一點(diǎn)小故事吧

將構(gòu)造函數(shù)當(dāng)做函數(shù)使用
    function Person(name,age){
      this.name=name;
      this.age=age;
      this.sayName=function(){
        return this.name;
      }
    }
    
    //當(dāng)做構(gòu)造函數(shù)使用
    var person1 = new Person("Young", 18);
    person1.sayName();
    console.log(person1.name + ":" + person1.age);
    
    //當(dāng)做普通函數(shù)調(diào)用
    Person("Wind", 18);
    console.log(window.sayName());
    
    //在另一個(gè)作用域中調(diào)用
    var obj = new Object();
    Person.call(obj, "bird", 100);
    console.log(obj.sayName());
構(gòu)造函數(shù)優(yōu)缺點(diǎn)

優(yōu)點(diǎn):可以將它的實(shí)例標(biāo)識(shí)為一種特定類(lèi)型

缺點(diǎn):每個(gè)方法都要在每個(gè)實(shí)例上重新創(chuàng)建一遍。當(dāng)然你也可以這樣改:

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

改為調(diào)用全局函數(shù),這樣一來(lái)毫無(wú)封裝性可言。。。接下來(lái)的原型模式可以彌補(bǔ)這個(gè)的不足

原型模式
    function Person(){
      
    }
    Person.prototype.name = "Young";
    Person.prototype.age = 18;
    Person.prototype.sayName = function(){
      return this.name;
    }
    
    var person1 = new Person();
    console.log(person1.sayName());
    var person2 = new Person();
    console.log(person1.sayName());
    alert(person1.sayName === person2.sayName);
    //person1和person2訪(fǎng)問(wèn)的是同一組屬性的同一個(gè)sayName()函數(shù)

雖然可以通過(guò)對(duì)象實(shí)例訪(fǎng)問(wèn)保存在原型中的值,但卻不能通過(guò)實(shí)例對(duì)象重寫(xiě)原型中的值

    function Person(){
      
    }
    Person.prototype.name="Young";
    Person.prototype.age=18;
    Person.prototype.sayName=function(){
      return this.name;
    }
    
    var person1=new Person();
    var person2=new Person();
    person1.name="Wind";
    
    console.log(person1.sayName());//Wind
    console.log(person2.sayName());//Young
    alert(person1.sayName==person2.sayName);//true

在我們調(diào)用person1.sayName的時(shí)候,會(huì)先后執(zhí)行兩次搜索,解析器先確定實(shí)例person1是否有sayName的屬性,有則調(diào)用自己的屬性,沒(méi)有則搜索原型中的屬性。

    function Person(){
      
    }
    Person.prototype.name="Young";
    Person.prototype.age=18;
    Person.prototype.sayName=function(){
      return this.name;
    }
    
    var person1=new Person();
    var person2=new Person();
    
    person1.name="Wind";
    console.log(person1.sayName());//Wind
    console.log(person2.sayName());//Young
    
    delete person1.name;
    console.log(person1.sayName());//Young
    console.log(person2.sayName());//Young

使用hasOwnPropertyType方法可以檢測(cè)一個(gè)屬性是存在與原型中還是存在于實(shí)例中,該方法是從Object繼承來(lái)的,實(shí)例中為true,原型中為false。

枚舉對(duì)象上的實(shí)例屬性用Object.keys()方法
    function Person(){
      
    }
    Person.prototype.name="Young";
    Person.prototype.age=18;
    Person.prototype.sayName=function(){
      return this.name;
    }
    
    var keys=Object.keys(Person.prototype);
    console.log(keys);//["name", "age", "sayName"]

原型模式優(yōu)缺點(diǎn)

優(yōu)點(diǎn):不用每個(gè)方法都要在每個(gè)實(shí)例上重申一遍

缺點(diǎn):很少有人多帶帶使用原型模式地。。問(wèn)題詳列

    function Person(){
      
    }
    Person.prototype={
      constructor:Person,
      name:"Young",
      age:18,
      friends:["Big","Pig"],
      sayName:function(){
      return this.name;
      }
    };
    var p1=new Person();
    var p2=new Person();
    p1.friends.push("Mon");
    console.log(p1.friends);//["Big", "Pig", "Mon"]
    console.log(p2.friends);//["Big", "Pig", "Mon"]

正是因?yàn)閷?shí)例一般都要有自己的屬性,而我們這里將他放在了Person.prototype中,所以隨著p1的修改,整個(gè)實(shí)例包括原型都修改了。那么,我們可以組合使用構(gòu)造函數(shù)模式和原型模式。

組合使用構(gòu)造函數(shù)模式和原型模式
    function Person(name,age){
      this.name=name;
      this.age=age;
      this.friends=["Big","Pig"];
    }
    Person.prototype={
      sayName:function(){
      return this.name;
      }
    };
    var p1=new Person("Young",18);
    var p2=new Person("Wind",78);
    p1.friends.push("Raganya");
    console.log(p1.friends);//["Big", "Pig", "Raganya"]
    console.log(p2.friends);//["Big", "Pig"]
    console.log(p1.friends==p2.friends);//false
    console.log(p1.sayName==p2.sayName);//true

這種模式是目前使用最廣泛、認(rèn)同度最高的一種創(chuàng)建自定義類(lèi)型的方法。是用來(lái)定義引用類(lèi)型的一種默認(rèn)模式。

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

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

相關(guān)文章

  • 白話(huà)解釋 Javascript 原型繼承(prototype inheritance)

    摘要:我們有了構(gòu)造函數(shù)之后,第二步開(kāi)始使用它構(gòu)造一個(gè)函數(shù)。來(lái)個(gè)例子這種方式很簡(jiǎn)單也很直接,你在構(gòu)造函數(shù)的原型上定義方法,那么用該構(gòu)造函數(shù)實(shí)例化出來(lái)的對(duì)象都可以通過(guò)原型繼承鏈訪(fǎng)問(wèn)到定義在構(gòu)造函數(shù)原型上的方法。 來(lái)源: 個(gè)人博客 白話(huà)解釋 Javascript 原型繼承(prototype inheritance) 什么是繼承? 學(xué)過(guò)面向?qū)ο蟮耐瑢W(xué)們是否還記得,老師整天掛在嘴邊的面向?qū)ο笕筇?..

    kid143 評(píng)論0 收藏0
  • JavaScript學(xué)習(xí)筆記(二) 對(duì)象與函數(shù)

    摘要:在中函數(shù)是一等對(duì)象,它們不被聲明為任何東西的一部分,而所引用的對(duì)象稱(chēng)為函數(shù)上下文并不是由聲明函數(shù)的方式?jīng)Q定的,而是由調(diào)用函數(shù)的方式?jīng)Q定的。更為準(zhǔn)確的表述應(yīng)該為當(dāng)對(duì)象充當(dāng)函數(shù)的調(diào)用函數(shù)上下文時(shí),函數(shù)就充當(dāng)了對(duì)象的方法。 引言:當(dāng)理解了對(duì)象和函數(shù)的基本概念,你可能會(huì)發(fā)現(xiàn),在JavaScript中有很多原以為理所當(dāng)然(或盲目接受)的事情開(kāi)始變得更有意義了。 1.JavaScript...

    jeffrey_up 評(píng)論0 收藏0
  • JavaScript對(duì)象

    摘要:對(duì)象的分類(lèi)內(nèi)置對(duì)象原生對(duì)象就是語(yǔ)言預(yù)定義的對(duì)象,在標(biāo)準(zhǔn)定義,有解釋器引擎提供具體實(shí)現(xiàn)宿主對(duì)象指的是運(yùn)行環(huán)境提供的對(duì)象。不過(guò)類(lèi)型是中所有類(lèi)型的父級(jí)所有類(lèi)型的對(duì)象都可以使用的屬性和方法,可以通過(guò)的構(gòu)造函數(shù)來(lái)創(chuàng)建自定義對(duì)象。 對(duì)象 javaScript中的對(duì)象,和其它編程語(yǔ)言中的對(duì)象一樣,可以比照現(xiàn)實(shí)生活中的對(duì)象來(lái)理解。在JavaScript中,一個(gè)對(duì)象可以是一個(gè)單獨(dú)擁有屬性和類(lèi)型的實(shí)體。和...

    xavier 評(píng)論0 收藏0
  • JavaScript中的面向對(duì)象(object-oriented)編程

    摘要:對(duì)象在中,除了數(shù)字字符串布爾值這幾個(gè)簡(jiǎn)單類(lèi)型外,其他的都是對(duì)象。那么在函數(shù)對(duì)象中,這兩個(gè)屬性的有什么區(qū)別呢表示該函數(shù)對(duì)象的原型表示使用來(lái)執(zhí)行該函數(shù)時(shí)這種函數(shù)一般成為構(gòu)造函數(shù),后面會(huì)講解,新創(chuàng)建的對(duì)象的原型。這時(shí)的函數(shù)通常稱(chēng)為構(gòu)造函數(shù)。。 本文原發(fā)于我的個(gè)人博客,經(jīng)多次修改后發(fā)到sf上。本文仍在不斷修改中,最新版請(qǐng)?jiān)L問(wèn)個(gè)人博客。 最近工作一直在用nodejs做開(kāi)發(fā),有了nodejs,...

    JerryZou 評(píng)論0 收藏0
  • JS對(duì)象(1)重新認(rèn)識(shí)面向對(duì)象

    摘要:對(duì)象重新認(rèn)識(shí)面向?qū)ο竺嫦驅(qū)ο髲脑O(shè)計(jì)模式上看,對(duì)象是計(jì)算機(jī)抽象現(xiàn)實(shí)世界的一種方式。除了字面式聲明方式之外,允許通過(guò)構(gòu)造器創(chuàng)建對(duì)象。每個(gè)構(gòu)造器實(shí)際上是一個(gè)函數(shù)對(duì)象該函數(shù)對(duì)象含有一個(gè)屬性用于實(shí)現(xiàn)基于原型的繼承和共享屬性。 title: JS對(duì)象(1)重新認(rèn)識(shí)面向?qū)ο? date: 2016-10-05 tags: JavaScript 0x00 面向?qū)ο?從設(shè)計(jì)模式上看,對(duì)象是...

    superw 評(píng)論0 收藏0
  • JavaScript基礎(chǔ)之創(chuàng)建對(duì)象、原型、原型對(duì)象、原型鏈

    摘要:在最開(kāi)始的時(shí)候,原型對(duì)象的設(shè)計(jì)主要是為了獲取對(duì)象的構(gòu)造函數(shù)。同理數(shù)組通過(guò)調(diào)用函數(shù)通過(guò)調(diào)用原型鏈中描述了原型鏈的概念,并將原型鏈作為實(shí)現(xiàn)繼承的主要方法。 對(duì)象的創(chuàng)建 在JavaScript中創(chuàng)建一個(gè)對(duì)象有三種方式??梢酝ㄟ^(guò)對(duì)象直接量、關(guān)鍵字new和Object.create()函數(shù)來(lái)創(chuàng)建對(duì)象。 1. 對(duì)象直接量 創(chuàng)建對(duì)象最直接的方式就是在JavaScript代碼中使用對(duì)象直接量。在ES5...

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

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

0條評(píng)論

閱讀需要支付1元查看
<