javascript設(shè)計(jì)模式之對(duì)象工廠函數(shù)與構(gòu)造函數(shù)詳解
下面通過(guò)文字詳解加代碼分析的方式給大家分享下javascript設(shè)計(jì)模式之對(duì)象工廠函數(shù)與構(gòu)造函數(shù)的相關(guān)知識(shí)。
概述使用對(duì)象字面量,或者向空對(duì)象中動(dòng)態(tài)地添加新成員,是最簡(jiǎn)單易用的對(duì)象創(chuàng)建方法。然而,除了這兩種常用的對(duì)象創(chuàng)建方式,JavaScript還提供了其他方法創(chuàng)建對(duì)象。1).使用工廠函數(shù)創(chuàng)建對(duì)象我們可以編寫(xiě)一個(gè)函數(shù),此函數(shù)的功能就是創(chuàng)建對(duì)象,可將其.
概述
使用對(duì)象字面量,或者向空對(duì)象中動(dòng)態(tài)地添加新成員,是最簡(jiǎn)單易用的對(duì)象創(chuàng)建方法。
然而,除了這兩種常用的對(duì)象創(chuàng)建方式,JavaScript還提供了其他方法創(chuàng)建對(duì)象。
1).使用工廠函數(shù)創(chuàng)建對(duì)象
我們可以編寫(xiě)一個(gè)函數(shù),此函數(shù)的功能就是創(chuàng)建對(duì)象,可將其稱為“對(duì)象工廠方法”。
//工廠函數(shù)
function createPerson(name, age, job) {
var o = new Object();
o.name = name;
o.age = age;
o.job = job;
o.sayName = function () {
console.info(this.name);
};
return o; } //使用工廠函數(shù)創(chuàng)建對(duì)象
var person1 = createPerson('張三', 29, '軟件工程師');
var person2 = createPerson('李四', 40, '醫(yī)生');
2).定義對(duì)象構(gòu)造函數(shù)
a).對(duì)象構(gòu)造函數(shù)首字母大寫(xiě)
b).內(nèi)部使用this關(guān)鍵字給對(duì)象添加成員
c).使用new關(guān)鍵字調(diào)用對(duì)象構(gòu)造函數(shù)
//定義對(duì)象“構(gòu)造”函數(shù)
function Person(name, age, job) {
this.name = name;
this.age = age;
this.job = job;
this.sayName = function () {
console.info(this.name);
};
} //使用new調(diào)用對(duì)象構(gòu)造函數(shù)創(chuàng)建對(duì)象
var p1 = new Person('張三', 29, '軟件工程師');
var p2 = new Person('李四', 40, '醫(yī)生');
以普通方式調(diào)用的“構(gòu)造函數(shù)”
構(gòu)造函數(shù)其實(shí)也是一個(gè)函數(shù),不同之處在于調(diào)用它時(shí)必須要加一個(gè)“new”關(guān)鍵字,如果不加這個(gè)關(guān)鍵字,則對(duì)它的調(diào)用被認(rèn)為是普通函數(shù)調(diào)用。
//作為普通函數(shù)調(diào)用的構(gòu)造函數(shù),通過(guò)this添加的屬性,
//成為了window對(duì)象的屬性與方法。
console.info(window.name);//張三
console.info(window.age); //29
console.info(window.job); //軟件工程師
對(duì)象構(gòu)造函數(shù)長(zhǎng)得這個(gè)樣:
function Person (name) {
this.name = name;
this.say = function () {
return "I am " + this.name;
};
}
實(shí)際上是這樣(示意):
function Person (name) {
// var this = {};
this.name = name;
this.say = function () {
return "I am " + this.name;
};
// return this;
}
構(gòu)造函數(shù)完成的工作
1. 創(chuàng)建一個(gè)新的對(duì)象
2. 讓構(gòu)造函數(shù)的this引用這一新創(chuàng)建的對(duì)象
3. 執(zhí)行構(gòu)造函數(shù)中的代碼,這些代碼通常完成向新對(duì)象添加屬性的工作
4. 向外界返回新創(chuàng)建的對(duì)象引用。
對(duì)象構(gòu)造函數(shù)與對(duì)象工廠方法的區(qū)別
1. 對(duì)象構(gòu)造函數(shù)中沒(méi)有顯式的對(duì)象創(chuàng)建代碼
2. 新對(duì)象應(yīng)具備的屬性與方法是通過(guò)this引用添加的.
3. 對(duì)象構(gòu)造函數(shù)中沒(méi)有return語(yǔ)句
通常會(huì)把對(duì)象構(gòu)造函數(shù)的首字母設(shè)置為大寫(xiě)的,以區(qū)別于普通函數(shù)。
對(duì)象的constructor屬性
a).使用對(duì)象工廠函數(shù)創(chuàng)建對(duì)象,每個(gè)對(duì)象的constructor屬性引用Object()
var person = createPerson('張三', 29, '軟件工程師');
//使用工廠方法創(chuàng)建對(duì)象,
其constructor屬性引用Object()函數(shù)
console.info(person1.constructor === Object);
//true
b).使用對(duì)象構(gòu)造函數(shù)創(chuàng)建對(duì)象,每個(gè)對(duì)象的constructor屬性引用這個(gè)構(gòu)造函數(shù)
var p = new Person('張三', 29, '軟件工程師');
//使用對(duì)象構(gòu)造函數(shù)創(chuàng)建對(duì)象,
//每個(gè)對(duì)象的constructor屬性,引用這個(gè)構(gòu)造函數(shù)
console.info(p.constructor === Person);
//true如何避免“忘記”new?可以使用arguments.callee解決這個(gè)問(wèn)題
//了解arguments.callee的作用
function TestArgumentsCallee()
{
console.info(this);
console.info(this instanceof TestArgumentsCallee);
console.info(this instanceof arguments.callee);
};
TestArgumentsCallee(); //window
//false
//false
new TestArgumentsCallee();
//TestArgumentsCallee
//true
//true
于是,可以直接用arguments.callee
//避免忘記new
function MyObject(value)
{
if (!(this instanceof arguments.callee))
{
//如果調(diào)用者忘記加上new了,就加上new再調(diào)用一次
return new MyObject(value);
}
this.prop = value;
}
//測(cè)試
var obj1 = new MyObject(100);
console.info(obj1.prop);//100
var obj2 = MyObject(200);
console.info(obj2.prop); //200
以上內(nèi)容就是javascript設(shè)計(jì)模式之對(duì)象工廠函數(shù)與構(gòu)造函數(shù)詳解,希望大家喜歡。
- 詳解Javascript 中的 class、構(gòu)造函數(shù)、工廠函數(shù)
- JavaScript構(gòu)造函數(shù)詳解
- JS特殊函數(shù)(Function()構(gòu)造函數(shù)、函數(shù)直接量)區(qū)別介紹
- JS面向?qū)ο蠡A(chǔ)講解(工廠模式、構(gòu)造函數(shù)模式、原型模式、混合模式、動(dòng)態(tài)原型模式)
- JS中的構(gòu)造函數(shù)詳細(xì)解析
- 深入理解javascript構(gòu)造函數(shù)和原型對(duì)象
- JavaScript中的工廠函數(shù)(推薦)
- JavaScript中工廠函數(shù)與構(gòu)造函數(shù)示例詳解
相關(guān)文章
JavaScript基礎(chǔ)心法 深淺拷貝(淺拷貝和深拷貝)
淺拷貝和深拷貝都是對(duì)于JS中的引用類(lèi)型而言的,淺拷貝就只是復(fù)制對(duì)象的引用,如果拷貝后的對(duì)象發(fā)生變化,原對(duì)象也會(huì)發(fā)生變化。只有深拷貝才是真正地對(duì)對(duì)象的拷貝2018-03-03
Javascript學(xué)習(xí)筆記之 對(duì)象篇(三) : hasOwnProperty
判斷一個(gè)屬性是定義在對(duì)象本身而不是繼承自原型鏈,我們需要使用從 Object.prototype 繼承而來(lái)的 hasOwnProperty 方法。 hasOwnProperty 方法是 Javascript 中唯一一個(gè)處理對(duì)象屬性而不會(huì)往上遍歷原型鏈的。2014-06-06
Javascript核心讀書(shū)有感之類(lèi)型、值和變量
這篇文章主要介紹了Javascript核心讀書(shū)有感之類(lèi)型、值和變量,需要的朋友可以參考下2015-02-02
JavaScript的RequireJS庫(kù)入門(mén)指南
這篇文章主要介紹了JavaScript的RequireJS庫(kù)入門(mén)指南,RequireJS庫(kù)的人氣近來(lái)攀升很快,需要的朋友可以參考下2015-07-07
深入理解JavaScript系列(18):面向?qū)ο缶幊讨瓻CMAScript實(shí)現(xiàn)
這篇文章主要介紹了深入理解JavaScript系列(18):面向?qū)ο缶幊讨瓻CMAScript實(shí)現(xiàn),本文講解了數(shù)據(jù)類(lèi)型、原始值類(lèi)型、Object類(lèi)型、動(dòng)態(tài)性、內(nèi)置對(duì)象、原生對(duì)象及宿主對(duì)象等內(nèi)容,需要的朋友可以參考下2015-03-03
javascript真的不難-回顧一下基礎(chǔ)知識(shí)
先來(lái)學(xué)習(xí)一下Javascript語(yǔ)言中的基礎(chǔ)知識(shí)問(wèn)題其時(shí)對(duì)于每種編程語(yǔ)言來(lái)說(shuō)基礎(chǔ)知識(shí)都是大同小異的,對(duì)變量,函數(shù),條件語(yǔ)句塊,循環(huán)語(yǔ)句塊等等,本文簡(jiǎn)要介紹一下,感興趣的朋友可以了解下2013-01-01

