在前面的章節(jié)中,我們學(xué)習(xí)了如何在JavaScript中創(chuàng)建對(duì)象。
前幾章中的示例是有限的。它們僅創(chuàng)建單個(gè)對(duì)象。
有時(shí)我們需要一個(gè)“ 模型”來創(chuàng)建許多相同類型的對(duì)象(示例)。
創(chuàng)建“模型”的方法是使用對(duì)象構(gòu)造函數(shù)。
一個(gè)對(duì)象的構(gòu)造函數(shù)可以很容易地創(chuàng)建多個(gè)對(duì)象(示例)具有相同的屬性和方法。
在下面的示例中,function User()是一個(gè)對(duì)象構(gòu)造函數(shù):
function User(fname, lname, age, loc) { this.firstName = fname; this.lastName = lname; this.age = age; this.location = loc; }
通過使用new關(guān)鍵字調(diào)用構(gòu)造函數(shù)來創(chuàng)建相同類型的對(duì)象:
var Seagull = new User("Seagull", "Anna", 22, "New Delhi"); var tarush = new User("Tarush", "Balodhi", 34, "Bihar");測(cè)試看看?/?
正如您看到的,我們可以通過使用不同的參數(shù)調(diào)用User構(gòu)造函數(shù)來快速構(gòu)建大量不同的用戶對(duì)象。這與JavaScript在其內(nèi)置構(gòu)造函數(shù)(如Array()和Date())中使用的模式完全相同。
JavaScript有一個(gè)特殊的關(guān)鍵字this,您可以在方法中使用它來引用當(dāng)前對(duì)象。
this在對(duì)象中使用時(shí),它的值是對(duì)象本身。
在構(gòu)造函數(shù)中this沒有值。它代替了新對(duì)象。創(chuàng)建新對(duì)象時(shí),this的值將成為新對(duì)象。
為了向?qū)ο筇砑有聦傩?,您可以使用賦值運(yùn)算符(=)將新值分配給屬性。
Seagull.weapon = "Sword";測(cè)試看看?/?
注意:該屬性將添加到Seagull中。不要。(不適用于任何其他User對(duì)象)。
為了向?qū)ο筇砑有路椒?,您可以使用賦值運(yùn)算符(=)將新函數(shù)分配給屬性。
Seagull.greet = function() { return "Hello World"; };測(cè)試看看?/?
注意:該方法將被添加到Seagull中。(不指向任何其他User對(duì)象)。
我們不能像向現(xiàn)有對(duì)象添加新屬性那樣,向構(gòu)造函數(shù)添加新屬性:
User.weapon = "Sword";測(cè)試看看?/?
要向構(gòu)造函數(shù)添加新屬性,必須將其添加到構(gòu)造函數(shù)中:
function User(fname, lname, age, loc) { this.firstName = fname; this.lastName = lname; this.age = age; this.location = loc; this.weapon = "Sword"; }測(cè)試看看?/?
有時(shí),我們希望在后期將新屬性添加到一個(gè)構(gòu)造函數(shù)中,該構(gòu)造函數(shù)將在所有對(duì)象(示例)之間共享。答案是對(duì)象原型。
構(gòu)造函數(shù)也可以定義方法。
我們不能像向現(xiàn)有對(duì)象添加新方法一樣,向構(gòu)造函數(shù)添加新方法。
向?qū)ο筇砑臃椒ū仨氃跇?gòu)造函數(shù)內(nèi)完成。
function User(fname, lname, age, loc) { this.firstName = fname; this.lastName = lname; this.age = age; this.location = loc; this.fullName = function() { return this.firstName + " " + this.lastName; }; }測(cè)試看看?/?
有時(shí)我們想在后期向構(gòu)造函數(shù)添加新方法,該方法將將在所有對(duì)象(示例)之間共享。答案是對(duì)象原型。
JavaScript具有以下用于本機(jī)對(duì)象的內(nèi)置構(gòu)造函數(shù):
let x1 = new String(); //一個(gè)新的String對(duì)象。 let x2 = new Number(); //一個(gè)新的number對(duì)象。 let x3 = new Boolean(); //一個(gè)新的布爾對(duì)象。 let x4 = new Object(); //一個(gè)新Object對(duì)象。 let x5 = new Array(); //一個(gè)新的Array對(duì)象。 let x6 = new RegExp(); //一個(gè)新的RegExp對(duì)象。 let x7 = new Date(); //一個(gè)新的date對(duì)象。 let x8 = new Function(); //一個(gè)新函數(shù)對(duì)象。測(cè)試看看?/?
正如你可以在上面看到,JavaScript有基本數(shù)據(jù)類型的對(duì)象有String,Number和Boolean。
我們沒有理由創(chuàng)建復(fù)雜的對(duì)象。因?yàn)樵贾狄斓枚唷?/p>
始終將數(shù)字,字符串或布爾值視為原始值。不作為對(duì)象。
將這些類型聲明為對(duì)象會(huì)降低執(zhí)行速度,并產(chǎn)生意外結(jié)果。
var str1 = "New Delhi"; var str2 = new String("New Delhi"); document.write(str1 === str2); // 返回錯(cuò)誤,因?yàn)閟tr1和str2具有不同的類型測(cè)試看看?/?
無法比較對(duì)象:
var str1 = new String("New Delhi"); var str2 = new String("New Delhi"); document.write(str1 == str2); // 返回錯(cuò)誤,因?yàn)閟tr1和str2具有不同的類型 document.write(str1 === str2); // r返回錯(cuò)誤,因?yàn)閟tr1和str2具有不同的類型測(cè)試看看?/?
也可以這樣做:
使用{}代替new Object()
使用""代替new String()
使用0代替new Number()
使用false代替new Boolean()
使用[]代替new Array()
使用/()/代替new RegExp()
使用function (){}代替new Function()
let x1 = {}; let x2 = ""; let x3 = 0; let x4 = false; let x5 = []; let x6 = /()/; let x7 = function(){};測(cè)試看看?/?
通常,JavaScript字符串是由字面量創(chuàng)建的原始值:var city = "New Delhi";。
但是,也可以使用new關(guān)鍵字,將字符串定義為對(duì)象: var city = new String("New Delhi");。
在“ JS字符串 ”一章中了解為什么不應(yīng)將字符串創(chuàng)建為對(duì)象。
通常,JavaScript數(shù)字是由字面量創(chuàng)建的原始值:var num = 50;。
但是,也可以使用new關(guān)鍵字,將數(shù)字定義為對(duì)象:var num = new Number(50);。
在“ JS Numbers ”一章中了解為什么不應(yīng)該將數(shù)字創(chuàng)建為對(duì)象。
通常,JavaScript字布爾值是由字面量創(chuàng)建的原始值:var x = false;。
但是,也可以使用new關(guān)鍵字,將布爾值定義為對(duì)象:var x = new Boolean(false);。
在“ JS布爾值 ”一章中了解為什么不應(yīng)該將布爾值創(chuàng)建為對(duì)象。