最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

淺析創(chuàng)建javascript對象的方法

 更新時間:2016年05月13日 08:44:35   投稿:jingxian  
下面小編就為大家?guī)硪黄獪\析創(chuàng)建javascript對象的方法。小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

一、工廠模式

function person (name,age) {
  var p=new Object();
  p.name=name;
  p.age=age;
  p.showMessage=function(){
    console.log("name:"+this.name+" age:"+this.age);
  }
  return p;
}
var p1=person("k1",28);
var p2=person("k2",29);
console.log(p1.showMessage==p2.showMessage);//false 不是同一個showMessage方法
console.log(p1.constructor);//[object] 都是object

工廠模式的缺陷是:沒解決對象識別的問題,而且每個對象的showMessage方法都不是同一個方法(每個方法在每個對象實例上都重新創(chuàng)建了一遍),增加了開銷

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

function Person (name,age) {
  this.name=name;
  this.age=age;
  this.showMessage=function(){
    console.log("name:"+this.name+" age:"+this.age);
  }
}
var p1=new Person("k1",28);
var p2=new Person("k2",29);
console.log(p1.showMessage==p2.showMessage);//false 不是同一個showMessage方法
console.log(p1.constructor);//[Person]
console.log(p1 instanceof Person);// true

構(gòu)造函數(shù)模式解決了對象識別的問題,但是每個對象的showMessage方法不是同一個方法(每個方法在每個對象實例上都重新創(chuàng)建了一遍),增加了開銷

三、原型模式

function Person () {
  
}
Person.prototype.name ="k";
Person.prototype.age =29;
Person.prototype.showMessage=function () {
  console.log("name:"+this.name+" age:"+this.age);
};

var p1=new Person();
p1.showMessage();//name:k age:29

var p2=new Person();
p2.showMessage();//name:k age:29

console.log(p1.showMessage==p2.showMessage);// true --引用的是同一函數(shù)
console.log(p1.constructor)//[Person] --對象識別
console.log(p1 instanceof Person)//true --對象識別
console.log(Person.prototype.isPrototypeOf(p1));// true
console.log(Object.getPrototypeOf(p1)==Person.prototype);// true

原型模式解決了“每個方法在每個對象實例上都重新創(chuàng)建了一遍”的問題,也解決了對象識別的問題

原型模式有個很大的問題是,因為掛載在函數(shù)prototype下面的所有對象、變量、函數(shù)都是被該函數(shù)的所有實例共享的,雖然通過實例p1、p2可以訪問到prototype的屬性,但是卻不能修改屬性值,例如p1.name="k1",只是在p1實例上添加了一個name="k1"的屬性,并沒改到prototype.name。如果是值類型還好,如果是引用類型的話,就會有問題了,看如下的例子

function Person () {  
};
Person.prototype.age =10;
Person.prototype.array=[1,2,3];

var p1=new Person();
var p2=new Person();
console.log(p1.array);// [1,2,3]
console.log(p2.array); //[1,2,3]
p1.array.push(4);
console.log(p1.array);//[1,2,3,4]
console.log(p2.array);//[1,2,3,4]

p1往array里面添加了值,在p2也反映出來了,因為他們都是指向同一個array

四、組合使用構(gòu)造函數(shù)模式和原型模式

這是最常見的創(chuàng)建對象的方式,結(jié)合了構(gòu)造函數(shù)和原型模式的優(yōu)點

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

Person.prototype.showMessage = function() {
  console.log("name:"+this.name+" age:"+this.age);
};

var p1=new Person("k",30);
p1.showMessage();

五、動態(tài)原型模式

主要是解決:把所有的信息都封裝在構(gòu)造函數(shù)中,更符合oo的思想

function Person (name,age) {
  this.name=name;
  this.age=age;
  if(typeof this.showMessage!="function"){
    Person.prototype.showMessage=function(){
      console.log("name:"+this.name+" age:"+this.age);
    }
  }
}

var p1=new Person("k",30);
p1.showMessage();

六、寄生構(gòu)造函數(shù)模式

function Person (name,age) {
  var o=new Object();
  o.name=name;
  o.age=age;
  o.sayName=function(){
    console.log(this.name);
  };
  return o;
}
var p1=new Person("k",28);
p1.sayName();

寄生構(gòu)造函數(shù)模式和工廠模式是一模一樣的,只不過創(chuàng)建對象的時候使用了new 關(guān)鍵字,上例:var p1=new Person("k",28)。

它的主要作用是:在這個構(gòu)造函數(shù)里面進(jìn)行功能的擴(kuò)展,例如,我想定義一個數(shù)組類型MyArray,它是以Array數(shù)組為基礎(chǔ)的,有一個自己的方法,如下

function MyArray(){
  var values=new Array();
  values.push.apply(values,arguments);
  //自己定義的方法
  values.toPipedString=function(){ 
    return this.join('|');
  };
  return values;
}
var colors=new MyArray("red","blue","green");
console.log(colors.toPipedString());
console.log(colors instanceof Array);

七、穩(wěn)妥構(gòu)造函數(shù)模式

穩(wěn)妥構(gòu)造函數(shù)遵循與寄生構(gòu)造函數(shù)類型的模式,但有兩點不同:一是不使用this,二是不使用new 調(diào)用構(gòu)造函數(shù)

function Person (name,age) {
  var o=new Object();
  var tempAge=age;

  o.name=name;
  o.age=age;

  o.sayName=function(){
    console.log(name);
  }
  o.sayAge=function(){
    console.log(tempAge);
  }
  return o;
}

var p1=Person("k1",28);
p1.sayName(); // k1
p1.sayAge(); // 28

p1.name="k2";
p1.age=30;
p1.sayName(); // k1
p1.sayAge();  //28

看到如上的輸出就很好理解什么叫穩(wěn)妥對象模式了,就是用這種模式創(chuàng)建的對象,沒有其他辦法能夠改變初始化時候傳入的值,這里是Person("k1",28),這樣的對象就是穩(wěn)妥對象,實際上這里使用到就是javascript的閉包了。

以上這篇淺析創(chuàng)建javascript對象的方法就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • JavaScript實現(xiàn)忘記密碼功能的示例代碼

    JavaScript實現(xiàn)忘記密碼功能的示例代碼

    這篇文章主要為大家詳細(xì)介紹了如何使用HTML、CSS和JavaScript實現(xiàn)一個完整的忘記密碼功能,文中的示例代碼講解詳細(xì),需要的可以參考一下
    2024-01-01
  • 基于JS實現(xiàn)頁面懸浮框的實例代碼

    基于JS實現(xiàn)頁面懸浮框的實例代碼

    這篇文章主要介紹了基于JS實現(xiàn)頁面懸浮框的實例代碼,代碼簡單易懂,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-12-12
  • uni-app小程序中父組件和子組件傳值的實現(xiàn)實例

    uni-app小程序中父組件和子組件傳值的實現(xiàn)實例

    uniapp父子組件引用傳值,和vue的一樣,沒有小程序那樣的麻煩,下面這篇文章主要給大家介紹了關(guān)于uni-app小程序中父組件和子組件傳值的相關(guān)資料,文中通過實例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-08-08
  • 學(xué)習(xí)JavaScript設(shè)計模式之策略模式

    學(xué)習(xí)JavaScript設(shè)計模式之策略模式

    這篇文章主要為大家介紹了JavaScript設(shè)計模式中的策略模式,對JavaScript設(shè)計模式感興趣的小伙伴們可以參考一下
    2016-01-01
  • JS實現(xiàn)點擊掉落特效

    JS實現(xiàn)點擊掉落特效

    這篇文章主要介紹了JS實現(xiàn)點擊掉落特效,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-01-01
  • JS onkeypress兼容性寫法詳解

    JS onkeypress兼容性寫法詳解

    這篇文章主要為大家詳細(xì)介紹了JS onkeypress兼容性的寫法,感興趣的小伙伴們可以參考一下
    2016-04-04
  • JavaScript實現(xiàn)同時調(diào)用多個函數(shù)的方法

    JavaScript實現(xiàn)同時調(diào)用多個函數(shù)的方法

    這篇文章主要介紹了JavaScript實現(xiàn)同時調(diào)用多個函數(shù)的方法,以一個簡單實例分析了JavaScript同時調(diào)用兩個函數(shù)的實現(xiàn)技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-11-11
  • JS對象數(shù)組去重的3種方法示例及對比

    JS對象數(shù)組去重的3種方法示例及對比

    這篇文章主要給大家介紹了關(guān)于JS對象數(shù)組去重的3種方法,三種方法分別包括使用filter和Map、使用reduce以及for循環(huán),文中每個方法都給出了示例代碼,需要的朋友可以參考下
    2021-07-07
  • JavaScrpt判斷一個數(shù)是否是質(zhì)數(shù)的實例代碼

    JavaScrpt判斷一個數(shù)是否是質(zhì)數(shù)的實例代碼

    本文通過實例代碼給大家分享了JavaScrpt判斷一個數(shù)是否是質(zhì)數(shù),需要的朋友參考下吧
    2017-06-06
  • 小程序跨頁面交互的作用與方法詳解

    小程序跨頁面交互的作用與方法詳解

    這篇文章主要介紹了小程序跨頁面交互的作用與方法詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-01-01

最新評論

广汉市| 双鸭山市| 汪清县| 象州县| 五原县| 西乡县| 宁武县| 读书| 红原县| 安远县| 磴口县| 米林县| 永寿县| 成都市| 盘锦市| 彭州市| 大兴区| 林州市| 湄潭县| 寿阳县| 青浦区| 雅安市| 庄浪县| 蚌埠市| 纳雍县| 丁青县| 尚志市| 沛县| 东安县| 泌阳县| 辰溪县| 邵武市| 古田县| 将乐县| 肥乡县| 岫岩| 渝北区| 淳化县| 罗山县| 虹口区| 丹棱县|