<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
工廠模式一般用於抽象建立特定物件的過程,是按照特定介面建立物件的方式。
function createPerson(name, age) { let o = {}; o.name = name; 0.age = age; o.study = function() { console.log(`${this.name} is studying`) } return o } const p1 = createPerson('張三', 18) const p2 = createPerson('李四', 20) p1.study() // 張三 is studying
值得一提的是,如果在 createPerson
函數中,o.study
改為箭頭函數,那麼列印的 this 會發生改變,這是因為箭頭函數發生了 this
指向的問題。
工廠模式的優點: 在 createPerson
中,可以用不同的引數多次呼叫工廠函數,每次都會返回包含特定引數和一個方法的物件。可以解決建立多個類似物件的問題。
工廠模式的缺點:
在 JS 中, 建構函式是用於建立特定型別物件的。像 Object
、Array
這樣的原生構造物件,執行時,可以直接在執行環境中執行。當然也可以自定義建構函式,以函數的形式為自己的物件型別定義屬性和方法。
function Student(name, age) { this.name = name; this.age = age; this.study = function() { console.log(`${this.name} is studying`) } } const p1 = new Student('張三', 18) const p2 = new Student('李四', 20)
通過上面的程式碼,可以實現和工廠模式一樣的效果。但是值得注意的是: 如果這裡的 study
函數變為箭頭函數, this
的指向是不會發生變化的。
如同上面的程式碼,如果呼叫建構函式,就必須使用 new
關鍵字,在這個過程中,建構函式會做四件事情:
__proto__
賦值為該建構函式的顯示原型 prototype
this
被賦值為這個新的物件(給新物件新增新的屬性)在標準函數中, this 參照的是把函數當成方法呼叫的上下文物件,這個時候常稱其為 this。
我們在上文說過,工廠模式和建構函式模式,其內部如果出現箭頭函數,那麼 this
的指向會出現不同,這是因為,箭頭函數中不存在 this
, 箭頭函數中的 this
, 會保留定義該函數的上下文,this
到底參照哪個物件必須到函數呼叫時,才會確定, 在工廠模式時, 雖然通過p1.study()
,進行呼叫,但是由於箭頭函數內部沒有 this
,所以向上查詢,找到function createPerson
函數, 繫結 window
, 而在建構函式模式中this 賦值給了這個新的物件,相當於箭頭函數的this
, 就是這個新的物件,也就是之後的範例。
可能,通過上面的描述,很多同學仍然對下面箭頭函數中的this,會保留定義該函數的上下文不太理解,我列舉一個例子。
// 工廠模式 function createPerson(name, age) { let o = {}; o.name = name; o.age = age; o.study = () => { console.log(`${this.name} is studying`) } return o } const obj = { name: '張三' } const p1 = createPerson.call(obj, '李四', 20) // createPerson 繫結 obj, 那麼箭頭函數也會繫結 obj p1.study() // 所以這裡的輸出是 張三 is studying,而不是 undefined
每個函數都會建立一個
prototype
屬性,這個屬性是一個物件,包含應該由特定參照型別的範例共用的屬性和方法。實際上,這個物件就是通過呼叫建構函式建立的物件的原型。使用原型物件的好處是,在它上面定義的屬性和方法可以被物件範例共用。原來在建構函式中直接賦值給物件範例的值,可以直接賦值給他們的原型。
function Student() {} Student.prototype.name = '張三'; Student.prototype.age = 20; Student.prototype.friends = ['ls', 'ww']; Student.prototype.study = function() { console.log(`${this.name} is studying`) } const p1 = new Student() const p2 = new Student()
通過上面建立的p1
, p2
,共用了Student
原型上的屬性,相當於創造了兩個擁有相同屬性的不同物件。同理,如果上面的 study
改為了箭頭函數,大家應該也能知道 this
繫結的是誰了吧。(Tip: new 和 顯示繫結不可以同時使用)
原型模式的優缺點 : 首先原型模式解決了上兩種模式造成的空間浪費問題,但是,其屬性都是共用的,所以一般來說,原型模式不會單獨去使用。
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45