国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

【9】JavaScript 面向?qū)ο蟾呒墶獙ο髣?chuàng)建模式

linkin / 1908人閱讀

摘要:解決了構(gòu)造函數(shù)模式不能共享方法的問題。六寄生構(gòu)造模式流程創(chuàng)建一個(gè)構(gòu)造函數(shù),在這個(gè)函數(shù)內(nèi)部創(chuàng)建一個(gè)對象,用返回對象。除了使用操作符并把使用的包裝函數(shù)叫做構(gòu)造函數(shù)以外,這個(gè)模式與工程模式其實(shí)是一模一樣的。

JavaScript面向?qū)ο蟾呒墶獙ο髣?chuàng)建模式 一、工廠模式

流程: 定義一個(gè)函數(shù),函數(shù)返回對象。

適用場景: 需要創(chuàng)建多個(gè)對象,都是Object類型。

優(yōu)點(diǎn):完成了返回一個(gè)對象的要求。

缺點(diǎn): 對象沒有一個(gè)具體的類型,無法通過constructor識別對象, 都是Object類型。多個(gè)實(shí)例的sayName方法都是實(shí)現(xiàn)一樣的效果,但是卻存儲了很多次。

// 1.工廠模式
function createPerson (name, age, job) { // 返回一個(gè)對象的函數(shù)==》工廠函數(shù)
  // 顯式的創(chuàng)建對象
  var o = new Object()
  o.name = name
  o.age = age
  o.job = job
  o.sayName = function () {
    alert(this.name)
  }
  return o // 返回對象
}
var p1 = createPerson("Tom", 12, "student")
var p2 = createPerson("Mandy", 22, "teacher")

// 或者:
function createPerson (name, age, job) { // 返回一個(gè)對象的函數(shù)==》工廠函數(shù)
  // 顯式的創(chuàng)建對象      
  var o = {
    name:name,
    age:age,
    job:job,
    sayName: function () {
      alert(this.name)
    }
  }
  return o // 返回對象
}
var p1 = createPerson("Tom", 12, "student")
var p2 = createPerson("Mandy", 22, "teacher"
二、.構(gòu)造函數(shù)模式

流程:創(chuàng)建一個(gè)構(gòu)造函數(shù),沒有顯式地創(chuàng)建對象,沒有return語句,通過new操作符創(chuàng)建對象。

使用場景:需要創(chuàng)建多個(gè)類型確定的對象。

優(yōu)點(diǎn):可以通過constructor或者instanceof來識別對象實(shí)例的類型。

缺點(diǎn):多個(gè)實(shí)例的sayName方法都是實(shí)現(xiàn)一樣的效果,但是卻存儲了很多次(兩個(gè)對象實(shí)例的sayName方法是不同的,因?yàn)榇娣诺牡刂凡煌?/p>

function Person (name, age) {
  this.name = name
  this.age = age
  this.sayName = function () {
    alert(this.name)
  }
}
var p1 = new Person("Tony", 14)
var p2 = new Person("Bob", 15
三、原型模式

流程:創(chuàng)建一個(gè)構(gòu)造函數(shù),給這個(gè)函數(shù)的prototype添加屬性和方法。通過new操作符創(chuàng)建對象。

使用場景:起始時(shí)對象內(nèi)部數(shù)據(jù)是確定的。

優(yōu)點(diǎn):(1)sayName方法是共享的,所有實(shí)例的sayName方法都指向同一個(gè)。(2)可以動態(tài)的添加原型對象的方法和屬性,并直接反映在對象實(shí)例上。

缺點(diǎn):(1)由于p1p2name屬性指向同一塊內(nèi)存區(qū)域,因此改變p1.name會導(dǎo)致p2.name改變。(2)所有的方法都是共享的,沒有辦法創(chuàng)建自己的屬性和方法,也沒有辦法像構(gòu)造函數(shù)哪像傳遞參數(shù)。

function Person () {}
Person.prototype.name = "Mandy"
Person.prototype.age = 16
Person.prototype.sayName = function () {
  alert(this.name)
}
var p1 = new Person()
var p2 = new Person()
p1.sayName() // "Mandy"
四、構(gòu)造函數(shù)+原型組合模式

流程:自定義構(gòu)造函數(shù),屬性在函數(shù)中初始化,方法添加到原型上。

適用場景:需要創(chuàng)建多個(gè)類型確定的對象。

優(yōu)點(diǎn):(1)解決了原型模式對于對象引用的問題。(2)解決了原型模式?jīng)]有辦法傳遞參數(shù)的問題。(3)解決了構(gòu)造函數(shù)模式不能共享方法的問題。

function Person (name) {
  this.name = name
}
Person.prototype.sayName = function () {
  console.log(this.name)
}
var p1 = new Person("Mandy")
p1.sayName() // Mandy
五、動態(tài)原型模式

流程:創(chuàng)建構(gòu)造函數(shù),在構(gòu)造函數(shù)內(nèi)部初始化屬性,在構(gòu)造函數(shù)內(nèi)部在原型上添加方法。通過new操作符創(chuàng)建對象。

需要創(chuàng)建多個(gè)類型確定的對象。

優(yōu)點(diǎn):(1)可以在初次調(diào)用構(gòu)造函數(shù)的時(shí)候就完成原型對象的修改。(2)對原型對象的修改能在所有的實(shí)例中反映。

缺點(diǎn):紅寶書上說了這個(gè)方案非常完美。

function Person(name, age) {
  // 屬性
  this.name = name
  this.age = age
  // 方法
  // 判斷sayName方法不存在的情況下,在原型上添加sayName方法。
  if(typeof this.sayName != "function") {
    Person.prototype.sayName = function () {
      console.log(this.name)
    }
  }
}
var p1 = new Person("Tom")
p1.sayName() // "Tom
六、寄生構(gòu)造模式

流程:創(chuàng)建一個(gè)構(gòu)造函數(shù),在這個(gè)函數(shù)內(nèi)部創(chuàng)建一個(gè)對象,用return返回對象。通過new操作符創(chuàng)建。

除了使用new操作符并把使用的包裝函數(shù)叫做構(gòu)造函數(shù)以外,這個(gè)模式與工程模式其實(shí)是一模一樣的。

function Person(name, age) { // 將創(chuàng)建對象的代碼封裝在函數(shù)中。
  // 顯式創(chuàng)建要返回的對象
  var o = new Object()
  o.name = name
  o.age = age
  o.sayName = function () {
    console.log(this.name)
  }
  return o   // 返回對象
}
var p1 = new Person("Mandy",18)
七、穩(wěn)妥構(gòu)造模式

優(yōu)點(diǎn):安全。除了調(diào)用sayName方法外,沒有其他辦法可以訪問name的值。

function Person (name, age) {
  // 創(chuàng)建要返回的對象
  var o = new Object()
  // 添加方法
  o.sayName = function () {
    console.log(this.name)
  }
  // 返回對象
  return o
}
var p1 = new Person("Mandy",20)
p1.name  // undefined
// 除了調(diào)用sayName方法外,沒有其他辦法可以訪問name的值。
p1.sayName() // "Mandy"

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

轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/105095.html

相關(guān)文章

  • 【連載】前端個(gè)人文章整理-從基礎(chǔ)到入門

    摘要:個(gè)人前端文章整理從最開始萌生寫文章的想法,到著手開始寫,再到現(xiàn)在已經(jīng)一年的時(shí)間了,由于工作比較忙,更新緩慢,后面還是會繼更新,現(xiàn)將已經(jīng)寫好的文章整理一個(gè)目錄,方便更多的小伙伴去學(xué)習(xí)。 showImg(https://segmentfault.com/img/remote/1460000017490740?w=1920&h=1080); 個(gè)人前端文章整理 從最開始萌生寫文章的想法,到著手...

    madthumb 評論0 收藏0
  • JavaScript構(gòu)造器理解

    摘要:類類的概念應(yīng)該是面向?qū)ο笳Z言的一個(gè)特色,但是并不像,等高級語言那樣擁有正式的類,而是多數(shù)通過構(gòu)造器以及原型方式來仿造實(shí)現(xiàn)。因此,出現(xiàn)了構(gòu)造函數(shù)方式,它的關(guān)鍵在于構(gòu)造器概念的引入。于是,這就產(chǎn)生了構(gòu)造函數(shù)原型法的類構(gòu)造方法。 類 Class 類的概念應(yīng)該是面向?qū)ο笳Z言的一個(gè)特色,但是JavaScript并不像Java,C++等高級語言那樣擁有正式的類,而是多數(shù)通過構(gòu)造器以及原型方式...

    PiscesYE 評論0 收藏0
  • JavaScript面向對象編程——RegExp類型

    摘要:由于某些字符類非常常用,的正則表達(dá)式中,使用特殊轉(zhuǎn)義字符表示他們。多行搜索代碼示例對象創(chuàng)建對象可以通過引用類型創(chuàng)建正則表達(dá)式對象參數(shù)參數(shù)被稱為模式,可以使任何簡單或復(fù)雜的正則表達(dá)式,包含字符類限定符分組向前查找以及反向引用等。 概述 正則表達(dá)式是什么 正則表達(dá)式(RegularExpression):由一些普通字符和特殊字符組成的,用以描述一種特定的字符規(guī)則的表達(dá)式。正則表達(dá)式常用在一...

    Magicer 評論0 收藏0
  • 2017年 最好的javascript 書籍

    摘要:請記住,這些書中的一些可能不是最新的,但概念和基礎(chǔ)仍應(yīng)適用。是最好的老師之一。的秘密由部分組成。在你完成這些書后,查看書籍和最好的本土?xí)? 我看過三本,第1本,第二本,第四本。第一本買的的實(shí)體書,其他兩本看的是電子書。第一本是大名鼎鼎老道寫的,書很薄,但是非常經(jīng)典。javascirpt忍者秘籍是jquery的作者寫的,也是非常經(jīng)典。you dont kown js系列也是非常好。看了...

    mingzhong 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<