3.Contructor(構造器)模式—精讀《JavaScript 設計模式》Addy Osmani著

同系列友情鏈接:


1.設計模式之初體驗—精讀《JavaScript 設計模式》Addy Osmani著
2.設計模式的分類—精讀《JavaScript 設計模式》Addy Osmani著

Construct(構造器)模式


在經典的面向對象編程語言中,Construtor是一種在內存已分配給該對象的情況下,用于初始化新創建對象的特殊方法。

在 JavaScript 中,幾乎所有東西都是都是對象,可能你會經常找不到對象,?,你承認不??

來看一下什么是 Object構造器 :

用于創建特定類型的對象——準備好對象以備使用,同時接受構造器可以使用的參數,以在第一次創建對象時,設置成員屬性和方法值。

下圖為:Constructor(構造器)模式

對象的創建

在 JavaScript 中,創建對象時有發生,常見的創建方式有兩種:

  1. 直接空對象賦值;
  2. 使用 new關鍵字
// 1. 直接空對象賦值
var newObject = {};// 2. 使用 new 關鍵字創建,newObject構造器的簡潔記法
var newObject = new Object();
復制代碼

在 Object構造器為特定的值創建對象封裝,或者沒有傳遞值時,它將創建 一個空對象并返回這個空對象;

對象的賦值

四種方法可以將鍵值賦值給一個對象:

  1. ECMAScript 3 兼容方式;
    1. “點”語法;
    2. 中括號語法
  2. 只適用于ECMAScript 5 方式;
    1. Object.defineProperty;
    2. Object.defineProperties
// 1.點語法
// 設置屬性
newObject.someKey = "Hello World!";
// 獲取屬性值
var key = newObject.someKey;// 2.中括號語法
// 設置屬性
newObject["somekey"] = "Hello world!";
// 獲取屬性值
var key = newObject["somekey"];// 3.Object.defineProperty
// 設置屬性
Object.defineProperty(newObject,"somekey",{value:"Hello World!",// 該屬性對應的值,默認為undefinedwritable:true,// 能否修改屬性的值,如果直接使用字面量定義對象,默認值為trueenumerable:true,// 表示該屬性是否可枚舉,即是否通過for-in循環或Object.keys()返回屬性,如果直接使用字面量定義對象,默認值為trueconfigurable:true// 表示能否通過delete刪除此屬性,能否修改屬性的特性,或能否修改把屬性修改為訪問器屬性,如果直接使用字面量定義對象,默認值為true
});
// 也可以簡化一下這種方式
var defineProp = function(obj,key,value){config.value=value;Object.defineProperty(obj,key,config);
}
// 使用上述方式,先創建一個空的 person對象
var person = Object.create(null);
// 然后設置各個屬性
defineProp(person,"car","Delorean");
defineProp(person,"dateOfBrith","1989");
defineProp(person,"hasBeard",false);
// 獲取屬性值同1,2
var key_car = person["car"];
var key_dateOfBrith = person["dateOfBrith"];
var key_hasBeard = person["hasBeard"];// 4.Object.defineProperties
// 設置屬性
Object.defineProperties(newObject,{"someKey":{value:"Hello World!",writable:true},"anotherKey":{value:"Foo Bar",writable:false}
});
// 獲取屬性值同1,2
var key_someKey = person["someKey"];
var key_anotherKey = person["anotherKey"];復制代碼

上面定義的這些方法甚至可以用于繼承如下所示:

// 用法
// 創建賽車司機 driver 對象,繼承于 person 對象
var driver = Object.create(person);
// 為 driver 設置一些屬性
defineProp(deriver,"topSpeed","100mph");
// 獲取繼承屬性
console.log(driver.dateOfBrith);
// 獲取我們設置的100mph屬性
console.log(driver.topSpeed);復制代碼

基本Constructor(構造器)

大家都知道 JavaScript 不支持類的概念,但是它卻支持與對象一起使用的 特殊的 Constructor 函數。通過在構造器前面加 new關鍵字,告訴 JavaScript 像使用構造器一樣實例化一個新的對象,并且對象成員由該函數定義。

在構造器內,關鍵字 this引用新創建的對象。回顧對象創建,基本的構造器看起來可能是這樣的:

function Car(model,year,miles){this.model = model;this.year = year;this.miles = miles;this.toString= function(){return this.model+ " has done " + this.miles + " miles";}
}
// 用法
var civic = new Car("Honda Civic",2009,20000);
var mondeo= new Car("Ford Mondeo",2010,5000);console.log(civic.toString());
console.log(mondeo.toString());
復制代碼

上面是一個簡單的構造器模式版本,但是也是存在問題的:因為她很難繼承,另一個 問題就是 toString()這樣的函數是為每個使用 Car 構造器創建的新對象而重新定義的。 這不是最理想的,因為這種函數應該在所有的 Car 實例之間共享。

其實這個問題很好解決,因為有很多ES3和 ES5兼容替代方法能夠用于創建對象。

帶原型的Constructor(構造器)

JavaScript中有一個名為 prototype 的屬性。調用 JavaScript 構造器創建一個對象后,新的對象就具有構造器原型的所有屬性。通過這種方式,可以創建多個 Car 對象,并訪問相同的原型。所以我們可以擴展原始示例,如下所示:

function Car(model,year,miles){this.model = model;this.year = year;this.miles = miles;
}
// 前方警告:小伙伴是否還記得反模式一條:避免重新定義 prototype對象
// 所以下面我們是使用 Object.prototype.newMethod而不是Object.prototype來定義對象內部的方法
Car.prototype.toString=function(){return this.model+ " has done " + this.miles + " miles";
}
// 用法
var civic = new Car("Honda Civic",2009,20000);
var mondeo= new Car("Ford Mondeo",2010,5000);console.log(civic.toString());
console.log(mondeo.toString());// 這樣 toString()的單一示實例就可以在所有的 Car 對象之間共享了
復制代碼

小結

今天的構造器模式,是不是很nice?

但是,你掌握了多少?

你可以動動小手指示例代碼都敲一遍,相信你可以更進一步了解,掌握 Constructor(構造器)模式。

下一篇將對Module(模塊)模式做詳細的介紹。這一模式更精彩,因為很快你就會知道為什么別人都那么寫了,以及模塊化的相關概念等等等

( ^_^ )/~~拜拜

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/389262.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/389262.shtml
英文地址,請注明出處:http://en.pswp.cn/news/389262.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

BZOJ 3653: 談笑風生(離線, 長鏈剖分, 后綴和)

題意 給你一顆有 \(n\) 個點并且以 \(1\) 為根的樹。共有 \(q\) 次詢問,每次詢問兩個參數 \(p, k\) 。詢問有多少對點 \((p, a, b)\) 滿足 \(p,a,b\) 為三個不同的點,\(p, a\) 都為 \(b\) 的祖先,且 \(p\) 到 \(a\) 的距離不能超過 \(k\) 。 …

搜索引擎優化學習原理_如何使用數據科學原理來改善您的搜索引擎優化工作

搜索引擎優化學習原理Search Engine Optimisation (SEO) is the discipline of using knowledge gained around how search engines work to build websites and publish content that can be found on search engines by the right people at the right time.搜索引擎優化(SEO…

Siamese網絡(孿生神經網絡)詳解

SiameseFCSiamese網絡(孿生神經網絡)本文參考文章:Siamese背景Siamese網絡解決的問題要解決什么問題?用了什么方法解決?應用的場景:Siamese的創新Siamese的理論Siamese的損失函數——Contrastive Loss損失函…

Dubbo 源碼分析 - 服務引用

1. 簡介 在上一篇文章中,我詳細的分析了服務導出的原理。本篇文章我們趁熱打鐵,繼續分析服務引用的原理。在 Dubbo 中,我們可以通過兩種方式引用遠程服務。第一種是使用服務直聯的方式引用服務,第二種方式是基于注冊中心進行引用。…

期權價格的上限和下限

期權按照買方權利性質分為:看漲期權和看跌期權 1、首先,看漲期權的上限和下限 看漲期權價格上限為其標的資產價格。 看漲期權是給予買方一個在未來買入標的資產的權利,如果該權利的價格高于標的資產的價格,那么投資者不如直接購買…

一件登錄facebook_我從Facebook的R教學中學到的6件事

一件登錄facebookBetween 2018 to 2019, I worked at Facebook as a data scientist — during that time I was involved in developing and teaching a class for R beginners. This was a two-day course that was taught about once a month to a group of roughly 15–20 …

SiameseFC超詳解

SiameseFC前言論文來源參考文章論文原理解讀首先要知道什么是SOT?(Siamese要做什么)SiameseFC要解決什么問題?SiameseFC用了什么方法解決?SiameseFC網絡效果如何?SiameseFC基本框架結構SiameseFC網絡結構Si…

Python全棧工程師(字符串/序列)

ParisGabriel Python 入門基礎字符串:str用來記錄文本信息字符串的表示方式:在非注釋中凡是用引號括起來的部分都是字符串‘’ 單引號“” 雙引號 三單引""" """ 三雙引有內容代表非空字符串否則是空字符串 區別&#xf…

跨庫數據表的運算

跨庫數據表的運算,一直都是一個說難不算太難,說簡單卻又不是很簡單的、總之是一個麻煩的事。大量的、散布在不同數據庫中的數據表們,明明感覺要把它們合并起來,再來個小小的計算,似乎也就那么回事……但真要做起來&…

FCN全卷積網絡隨筆

參考:四、全卷積網絡FCN詳細講解(超級詳細哦) 這篇文章已經寫的很好了,這里說兩個我考慮的點。 第一個就是:FCN在縮小成heat map,為什么要通過上采樣還原回原圖大小? 我覺得這個的原因是因為&a…

熊貓在線壓縮圖_回歸圖與熊貓和脾氣暴躁

熊貓在線壓縮圖數據可視化 (Data Visualization) I like the plotting facilities that come with Pandas. Yes, there are many other plotting libraries such as Seaborn, Bokeh and Plotly but for most purposes, I am very happy with the simplicity of Pandas plotting…

敏捷數據科學pdf_敏捷數據科學數據科學可以并且應該是敏捷的

敏捷數據科學pdfTL;DR;TL; DR; I have encountered a lot of resistance in the data science community against agile methodology and specifically scrum framework; 在數據科學界,我遇到了許多反對敏捷方法論(特別是Scrum框架)的抵制。 I don’t see it this …

oracle的連接字符串

OracleConnection oCnn new OracleConnection("Data SourceORCL_SERVER;USERM70;PASSWORDmmm;");建立個角色 建立個表空間(角色與表空間同名的) 在方案里就可以建立表,然后就哦了 10g

SiameseRPN詳解

SiameseRPN論文來源論文背景一,簡介二,研究動機三、相關工作論文理論注意:網絡結構:1.Siamese Network2.RPN3.LOSS計算4.Tracking論文的優缺點分析一、Siamese-RPN的貢獻/優點:二、Siamese-RPN的缺點:代碼流…

數據可視化 信息可視化_可視化數據操作數據可視化與紀錄片的共同點

數據可視化 信息可視化Data visualization is a great way to celebrate our favorite pieces of art as well as reveal connections and ideas that were previously invisible. More importantly, it’s a fun way to connect things we love — visualizing data and kicki…

python 圖表_使用Streamlit-Python將動畫圖表添加到儀表板

python 圖表介紹 (Introduction) I have been thinking of trying out Streamlit for a while. So last weekend, I spent some time tinkering with it. If you have never heard of this tool before, it provides a very friendly way to create custom interactive Data we…

Python--day26--復習

轉載于:https://www.cnblogs.com/xudj/p/9953293.html

sockets C#

Microsoft.Net Framework為應用程序訪問Internet提供了分層的、可擴展的以及受管轄的網絡服務,其名字空間System.Net和System.Net.Sockets包含豐富的類可以開發多種網絡應用程序。.Net類采用的分層結構允許應用程序在不同的控制級別上訪問網絡,開發人員可…

667. Beautiful Arrangement II

找規律 1&#xff0c;2&#xff0c;... , n 亂序排列&#xff0c;相鄰數據的絕對差最多有n-1種 比如1&#xff0c;2&#xff0c;3&#xff0c;4&#xff0c;5對應于 1 5 2 4 3 class Solution { public:vector<int> constructArray(int n, int k) {vector<int> re…