亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

JavaScript創(chuàng)建對(duì)象方式總結(jié)【工廠模式、構(gòu)造函數(shù)模式、原型模式等】

 更新時(shí)間:2018年12月19日 12:01:23   作者:huansky  
這篇文章主要介紹了JavaScript創(chuàng)建對(duì)象方式,結(jié)合實(shí)例形式總結(jié)分析了工廠模式、構(gòu)造函數(shù)模式、原型模式等各種常見(jiàn)的javascript對(duì)象創(chuàng)建方式與相關(guān)操作注意事項(xiàng),需要的朋友可以參考下

本文實(shí)例總結(jié)了JavaScript創(chuàng)建對(duì)象方式。分享給大家供大家參考,具體如下:

這里主要是對(duì)《JavaScript高級(jí)程序設(shè)計(jì)》第六章(面向?qū)ο蟮某绦蛟O(shè)計(jì))的總結(jié),書(shū)上的這章至少看了4遍是有的。該章主要講對(duì)象的創(chuàng)建與繼承。其中創(chuàng)建對(duì)象和繼承方式至少6種,再加上一些方法屬性,很容易搞得暈頭轉(zhuǎn)向的。因此有必要對(duì)本章的內(nèi)容理一理,以后忘了也好過(guò)來(lái)看一看。

由于文章長(zhǎng)度的限制,本文主要講創(chuàng)建對(duì)象。

1 創(chuàng)建對(duì)象

1.1 一般方法

使用Object或者采用對(duì)象字面量的方法。

var o = {a: 1};
var o2=new Object();
o2.a=1;

缺點(diǎn):使用同一個(gè)接口創(chuàng)建很多對(duì)象,會(huì)產(chǎn)生大量重復(fù)的代碼。

1.2工廠模式

function parent(name,age){
  var Child = new Object();
  Child.name=name;
  Child.age=age;
  Child.sayHi=function(){
    console.log("Hi");
  }
  return Child;
};
var x = Parent("Tom",12);
console.log(x.name); //Tom
x.sayHi(); //Hi

函數(shù)parent能夠根據(jù)接受的參數(shù)來(lái)構(gòu)建一個(gè)包含所有必要信息的child對(duì)象??梢詿o(wú)限次調(diào)用這個(gè)函數(shù),都會(huì)返回一個(gè)包含兩個(gè)屬性和一個(gè)方法的對(duì)象。

解決了創(chuàng)建多個(gè)相似對(duì)象的問(wèn)題,但卻沒(méi)有解決對(duì)象識(shí)別的問(wèn)題(即怎樣知道一個(gè)對(duì)象的類型)。

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

對(duì)于構(gòu)造函數(shù)這個(gè)名字,學(xué)過(guò)java或者c++的同學(xué)應(yīng)該都是知道的,在js里也是差不多的。

用構(gòu)造函數(shù)將上面的例子重寫(xiě)如下:

function Parent(name,age){
  this.name=name;
  this.age=age;
  this.sayHi=function(){
    console.log("Hi");
  };
}
var x = new Parent("Tom",12);
console.log(x.name); //Tom
x.sayHi(); //Hi

對(duì)于構(gòu)造函數(shù),我們需要在調(diào)用的時(shí)候加關(guān)鍵字 new。要注意的是,構(gòu)造函數(shù)始終是以一個(gè)大寫(xiě)字母開(kāi)頭,而非構(gòu)造函數(shù)始終是以一個(gè)小寫(xiě)字母開(kāi)頭。

與工廠模式相比,主要有以下幾個(gè)不同之處:

  • 沒(méi)有顯示地創(chuàng)建對(duì)象;
  • 直接將屬性和方法賦給了this對(duì)象;
  • 沒(méi)有return語(yǔ)句。

缺點(diǎn):使用構(gòu)造函數(shù)的缺點(diǎn)就是每個(gè)方法都需要在每個(gè)實(shí)例上重新創(chuàng)建一遍。

1.4原型模式

我們創(chuàng)建的每一個(gè)函數(shù)都有一個(gè)prototype(原型)屬性,這個(gè)屬性是一個(gè)指針,指向一個(gè)對(duì)象,而這個(gè)對(duì)象的用途是包含可以由特定類型的所有實(shí)例共享的屬性與方法。使用原型對(duì)象的好處是可以讓所有的對(duì)象實(shí)例共享其包含的屬性與方法。

function Parent(name,age){
  Parent.prototype.name=name;
  Parent.prototype.age=age;
  Parent.prototype.sayHi=function(){
    console.log("Hi");
  };
}
var x = new Parent("Tom",12);
console.log(x.name); //Tom
x.sayHi(); //Hi

缺點(diǎn):優(yōu)點(diǎn)就是其缺點(diǎn),方法屬性都可以共享。具體可以看下面這個(gè)例子

function Parent(name,age){
  Parent.prototype.name=name;
  Parent.prototype.age=age;
  Parent.prototype.arr=["123","we"];
  Parent.prototype.sayHi=function(){
    console.log("Hi");
  };
}
var x = new Parent("Tom",12);
var y = new Parent("Tom1",12);
x.arr.push("x");
y.arr.push("y");
console.log(x.arr);//["123", "we", "x", "y"]
console.log(y.arr);//["123", "we", "x", "y"]

對(duì)象x修改自己的屬性,竟然會(huì)影響到y(tǒng)對(duì)象;同理,對(duì)y也一樣。這個(gè)明顯就很不合理啊,太可怕了!

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

function Parent(name,age){
  //只把屬性留在這里定義,方法放在原型對(duì)象中
  this.name=name;
  this.age=age;
}
//第一種方式
Parent.prototype.sayHi=function(){
  console.log("Hi");
};
//第二種方式
//由于采用對(duì)象字面量,因此必須修正其constructor屬性;
Parent.prototype={
  constructor:Parent,
  sayHi:function(){
    console.log("Hi");
  }
}
var x = new Parent("Tom",12);
console.log(x.name); //Tom
x.sayHi(); //Hi

在這個(gè)例子中,實(shí)例屬性都是在構(gòu)造函數(shù)中定義的,而由所有實(shí)例共享的屬性constructor和方法則是在原型中定義的。

是目前使用最廣泛、認(rèn)同度最高的一種創(chuàng)建自定義類型的方法。

--------------------------感覺(jué)后面幾種方法有些變態(tài)了--------------------------------

1.6 動(dòng)態(tài)原型模式

function Parent(name,age){
  this.name=name;
  this.age=age;
  if( typeof this.sayHi !="function"){
    Parent.prototype.sayHi=function(){
      console.log("Hi");
    };
  }
}
var x = new Parent("Tom",12);
console.log(x.name); //Tom
x.sayHi(); //Hi

先檢查某個(gè)應(yīng)該存在方法是否有效再來(lái)決定是否需要初始化原型。

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

當(dāng)前面幾種都不適用的情況下,可以使用寄生構(gòu)造函數(shù)模式。這種函數(shù)的基本思想是創(chuàng)建一個(gè)函數(shù),該函數(shù)的作用僅僅是封裝創(chuàng)建對(duì)象的代碼,然后再返回新創(chuàng)建的對(duì)象。

function parent(name,age){
  var Child = new Object();
  Child.name=name;
  Child.age=age;
  Child.sayHi=function(){
    console.log("Hi");
  }
  return Child;
};
var x = Parent("Tom",12);
console.log(x.name); //Tom
x.sayHi(); //Hi

但是其實(shí)就是和工廠模式一模一樣,你TM在逗我嗎?????

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

穩(wěn)妥構(gòu)造函數(shù)遵循與寄生構(gòu)造函數(shù)模式類似的模式,但有兩點(diǎn)不同:一是新創(chuàng)建對(duì)象的實(shí)例方法不引用this; 二是不使用new操作調(diào)用構(gòu)造函數(shù)。

function Parent(name,age){
  var o=new Object();
   //私有變量或者方法
  var name=name,
    age=age;
  o.sayName=function(){
     //name前面沒(méi)有this
    console.log(name+" "+age)
  }
  return o;
}
var x = Parent("Tom",12);
x.sayName(); //Tom 12

變量x中保存的是一個(gè)穩(wěn)妥對(duì)象,而除了調(diào)用sayName()方法外,沒(méi)有別的方式可以訪問(wèn)其數(shù)據(jù)成員。

更多關(guān)于JavaScript相關(guān)內(nèi)容還可查看本站專題:《javascript面向?qū)ο笕腴T教程》、《JavaScript錯(cuò)誤與調(diào)試技巧總結(jié)》、《JavaScript數(shù)據(jù)結(jié)構(gòu)與算法技巧總結(jié)》、《JavaScript遍歷算法與技巧總結(jié)》及《JavaScript數(shù)學(xué)運(yùn)算用法總結(jié)

希望本文所述對(duì)大家JavaScript程序設(shè)計(jì)有所幫助。

相關(guān)文章

  • JavaScript獲得input元素value值的方法

    JavaScript獲得input元素value值的方法

    在頁(yè)面中我們最常見(jiàn)的頁(yè)面元素就是input了,但是我們?nèi)绾斡肑avaScript得到網(wǎng)頁(yè)input中輸入的value值呢,其實(shí)很簡(jiǎn)單,方法也不止一種,今天給大家分享兩種JavaScript獲得input元素value值的方法,感興趣的朋友跟隨小編一起看看吧
    2023-10-10
  • 原生javascript實(shí)現(xiàn)類似vue的數(shù)據(jù)綁定功能示例【觀察者模式】

    原生javascript實(shí)現(xiàn)類似vue的數(shù)據(jù)綁定功能示例【觀察者模式】

    這篇文章主要介紹了原生javascript實(shí)現(xiàn)類似vue的數(shù)據(jù)綁定功能,結(jié)合實(shí)例形式分析了JavaScript基于觀察者模式實(shí)現(xiàn)類似vue的數(shù)據(jù)綁定相關(guān)操作技巧,需要的朋友可以參考下
    2020-02-02
  • JavaScript可否多線程? 深入理解JavaScript定時(shí)機(jī)制

    JavaScript可否多線程? 深入理解JavaScript定時(shí)機(jī)制

    JavaScript的setTimeout與setInterval是兩個(gè)很容易欺騙別人感情的方法,因?yàn)槲覀冮_(kāi)始常常以為調(diào)用了就會(huì)按既定的方式執(zhí)行, 我想不少人都深有同感
    2012-05-05
  • 移動(dòng)端如何用下拉刷新的方式實(shí)現(xiàn)上拉加載

    移動(dòng)端如何用下拉刷新的方式實(shí)現(xiàn)上拉加載

    這篇文章主要介紹了移動(dòng)端如何用下拉刷新的方式實(shí)現(xiàn)上拉加載,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2018-12-12
  • javascript數(shù)據(jù)類型詳解

    javascript數(shù)據(jù)類型詳解

    本文介紹了對(duì)javascript數(shù)據(jù)類型;隱式轉(zhuǎn)換 (+ 和 -,== 和 ===);包裝對(duì)象等相關(guān)知識(shí)進(jìn)行詳細(xì)介紹,具有很好的參考價(jià)值,下面跟著小編一起來(lái)看下吧
    2017-02-02
  • 深入探究V8引擎的底層原理

    深入探究V8引擎的底層原理

    V8引擎是一款由Google開(kāi)發(fā)的JavaScript引擎,V8引擎采用了眾多的優(yōu)化措施,使得其在性能上得到了極大的提升,能夠高效地執(zhí)行JavaScript代碼,本文將和大家一起探討一下V8引擎底層原理,探究其優(yōu)異性能之謎
    2023-06-06
  • echarts大屏字體自適應(yīng)的方法步驟

    echarts大屏字體自適應(yīng)的方法步驟

    這篇文章主要介紹了echarts大屏字體自適應(yīng)的方法步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-07-07
  • 按鍵測(cè)試,支持像 Ctrl+Alt+Shift+T 的組合鍵

    按鍵測(cè)試,支持像 Ctrl+Alt+Shift+T 的組合鍵

    按鍵測(cè)試,支持像 Ctrl+Alt+Shift+T 的組合鍵...
    2006-10-10
  • JavaScript中的事件循環(huán)機(jī)制及其運(yùn)行原理

    JavaScript中的事件循環(huán)機(jī)制及其運(yùn)行原理

    JavaScript中的事件循環(huán)機(jī)制是一種異步處理機(jī)制,通過(guò)維護(hù)事件隊(duì)列和消息隊(duì)列,實(shí)現(xiàn)任務(wù)的分發(fā)和執(zhí)行。事件循環(huán)機(jī)制由主線程和任務(wù)隊(duì)列構(gòu)成,主線程運(yùn)行完當(dāng)前任務(wù)后會(huì)檢查任務(wù)隊(duì)列中是否有待執(zhí)行的任務(wù),如有則執(zhí)行,否則等待
    2023-04-04
  • Electron?自定義窗口桌面時(shí)鐘實(shí)現(xiàn)示例詳解

    Electron?自定義窗口桌面時(shí)鐘實(shí)現(xiàn)示例詳解

    這篇文章主要為大家介紹了Electron?自定義窗口桌面時(shí)鐘實(shí)現(xiàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-03-03

最新評(píng)論