摘要:在中,除了幾種原始類(lèi)型外,其余皆為對(duì)象,,既然對(duì)象如此重要,那就列舉一下在中如何創(chuàng)建對(duì)象通過(guò)構(gòu)造函數(shù)創(chuàng)建對(duì)象實(shí)例對(duì)象字面量對(duì)象字面量是對(duì)象定義的一種簡(jiǎn)寫(xiě)形式,目的在于簡(jiǎn)化創(chuàng)建包含大量屬性的對(duì)象的過(guò)程。
在Javascript中,除了幾種原始類(lèi)型外,其余皆為對(duì)象(Object,Array ...),既然對(duì)象如此重要,那就列舉一下在Javascript中如何創(chuàng)建對(duì)象:
var person = new Object(); person.name = "krew"; person.age = 26;
對(duì)象字面量是對(duì)象定義的一種簡(jiǎn)寫(xiě)形式,目的在于簡(jiǎn)化創(chuàng)建包含大量屬性的對(duì)象的過(guò)程。
var person = { name : "krew", age : 26 }
工廠(chǎng)模式是一種設(shè)計(jì)模式,通過(guò)對(duì)創(chuàng)建具體對(duì)象的過(guò)程進(jìn)行抽象。使用函數(shù)來(lái)封裝創(chuàng)建對(duì)象的細(xì)節(jié),可以無(wú)數(shù)次地調(diào)用用該函數(shù),每次都可以得到包含制定內(nèi)容的對(duì)象。
function personFactory(name, age){ var obj = new Object(); obj.name = name; obj.age = age; obj.sayName = function(){ console.log(this.name); } return obj; } var person1 = personFactory("krew", 26); var person2 = personFactory("john", 20);
基于工廠(chǎng)模式創(chuàng)建對(duì)象雖然方便,但是創(chuàng)建出來(lái)的對(duì)象沒(méi)有特定的對(duì)象類(lèi)型(比如原生對(duì)象Object, Array的實(shí)例都有自己的類(lèi)型),所以就采用構(gòu)造函數(shù)模式來(lái)創(chuàng)建對(duì)象,就能解決識(shí)別對(duì)象類(lèi)型的問(wèn)題。
function Person(name, age){ this.name = name; this.age = age; this.sayName = function() { console.log(this.name); } } var person1 = new Person("krew", 26); var person2 = new Person("john", 20); person1.sayName(); // "krew" person2.sayName(); // "john" person1.constructor == Person // true person2.constructor == Person // true
每個(gè)函數(shù)在創(chuàng)建的時(shí)候,就會(huì)根據(jù)特定的規(guī)則為該函數(shù)創(chuàng)建一個(gè)prototype屬性,這個(gè)屬性是指向函數(shù)的原型對(duì)象的指針。這個(gè)原型對(duì)象的包含可以由特定類(lèi)型的所有實(shí)例共享的屬性和方法。所以,在構(gòu)造函數(shù)的prototype屬性上添加屬性與方法,該構(gòu)造函數(shù)的所有實(shí)例都會(huì)在原型鏈上查找到這些屬性與方法。
function Person() { } Person.prototype.name = "krew"; Person.prototype.age = 26; Person.prototype.sayName = function() { console.log(this.name); } var person1 = new Person(); var person2 = new Person(); person1.sayName(); // "krew" person2.sayName(); // "krew"
由于原型對(duì)象中的屬性是被很多實(shí)例所共享的,對(duì)于引用類(lèi)型的屬性值,將會(huì)存在實(shí)例間無(wú)法隔離的問(wèn)題:
function Person() { } Person.prototype = { constructor : Person, name : "krew", age : 26, friends : ["john", "kitty"], showFriends : function() { console.log(this.friends); } } var person1 = new Person(); var person2 = new Person(); person1.friends.push("petter"); person1.showFriends() // ["john", "kitty", "petter"] person2.showFriends() // ["john", "kitty", "petter"]
可以看到,僅是在實(shí)例person1的friends屬性上添加值,但person2也跟著變化。這是因?yàn)閒riends數(shù)組存在于Person.prototype而非person1中,person1與person2中的friends皆為引用Person.prototype中的friends,所以當(dāng)通過(guò)person1來(lái)改變friends的時(shí)候,person2中的friends也會(huì)反映出來(lái)。
通過(guò)組合構(gòu)造函數(shù)與原型模式可以解決上面出現(xiàn)的問(wèn)題,構(gòu)造函數(shù)模式用于定義實(shí)例屬性,而原型模式用于定義方法和共享的屬性,每個(gè)實(shí)例會(huì)有自己的一份實(shí)例屬性,同時(shí)又共享著方法的引用,極大的節(jié)省了內(nèi)存。
function Person(name, age) { this.name = name; this.age = age; } Person.prototype.sayName = function() { console.log(this.name); } var person1 = new Person("krew", 26); var person2 = new Person("john", 20); person1.sayName(); // "krew" person2.sayName(); // "john"
function Person(name, age){ this.name = name; this.age = age; if (typeof this.sayName != "function") { Person.prototype.sayName = function() { console.log(this.name); } } } var person1 = new Person("krew", 26); var person2 = new Person("john", 20); person1.sayName(); // "krew" person2.sayName(); // "john"
function Person(name, age) { var obj = new Object(); obj.name = name; obj.age = age; obj.sayName = function() { console.log(this.name); } return obj; } var person1 = new Person("krew", 26); var person2 = new Person("john", 20); person1.sayName(); // "krew" person2.sayName(); // "john"
function Person(name) { var obj = new Object(); obj.sayName = function() { console.log(name); } return obj; } var person1 = Person("krew"); var person2 = Person("john"); person1.sayName(); // "krew" person2.sayName(); // "john"
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/88229.html
摘要:命令作用作用是執(zhí)行構(gòu)造函數(shù),返回實(shí)例對(duì)象上面例子是自定義一個(gè)構(gòu)造函數(shù),其最大的特點(diǎn)就是首字母大寫(xiě),用執(zhí)行構(gòu)造函數(shù)其中,在的執(zhí)行下,代表了實(shí)例化后的對(duì)象,這個(gè)也就有屬性注意點(diǎn)如果不用執(zhí)行構(gòu)造函數(shù),那么指向的是全局有兩種方式可以避免內(nèi)部定義嚴(yán)格 new命令 new作用 作用是執(zhí)行構(gòu)造函數(shù),返回實(shí)例對(duì)象 function F() { this.name = object } var ...
摘要:總結(jié)記錄常見(jiàn)的五種類(lèi)型報(bào)錯(cuò)語(yǔ)法解析錯(cuò)誤變量未定義變量類(lèi)型錯(cuò)誤數(shù)組越界相關(guān)函數(shù)參數(shù)錯(cuò)誤能防止報(bào)錯(cuò)導(dǎo)致后面代碼不能執(zhí)行問(wèn)題的未定義不影響后面函數(shù)的執(zhí)行注意點(diǎn)在報(bào)錯(cuò)前,不執(zhí)行里的內(nèi)容不報(bào)錯(cuò)也不執(zhí)行在報(bào)錯(cuò)后,的內(nèi)容不會(huì)被執(zhí)行執(zhí)行完結(jié)束,如果有 總結(jié)記錄 try-catch-finally 常見(jiàn)的五種類(lèi)型報(bào)錯(cuò) SyntaxError語(yǔ)法解析錯(cuò)誤 ReferenceError變量未定義 Type...
摘要:原型要掌握這三者之間的關(guān)系,通過(guò)代碼例子記錄一下自身屬性的這里就是通過(guò)代碼看一下做了什么默認(rèn)情況下,將的所有屬性包括繼承的賦值給有什么東西呢自己的原型鏈,添加一個(gè)屬性,用來(lái)指明對(duì)象的誰(shuí)構(gòu)造的自身全部屬性,這邊構(gòu)建一個(gè)空對(duì)象原型,所以沒(méi)有自有 原型 要掌握這三者之間的關(guān)系prototype,constructor,__proto__通過(guò)代碼例子記錄一下 function F() { ...
摘要:它不區(qū)分該屬性是對(duì)象自身的屬性,還是繼承的屬性。那么我們要遍歷對(duì)象所有屬性,包括繼承以及不可遍歷的屬性,用加原型遍歷實(shí)現(xiàn)類(lèi)似的用遞歸 Object靜態(tài)方法 Object自身方法,必須由Object調(diào)用,實(shí)例對(duì)象并不能調(diào)用 Object.getPrototypeOf() 作用是獲取目標(biāo)對(duì)象的原型 function F() {}; var obj = new F(); console.lo...
摘要:繼承是面向?qū)ο缶幊陶Z(yǔ)言中的一個(gè)重要的概念,繼承可以使得子類(lèi)具有父類(lèi)的屬性和方法或者重新定義追加屬性和方法等。但是在中沒(méi)有類(lèi)的概念,是基于原型的語(yǔ)言,所以這就意味著對(duì)象可以直接從其他對(duì)象繼承。 繼承是面向?qū)ο缶幊陶Z(yǔ)言中的一個(gè)重要的概念,繼承可以使得子類(lèi)具有父類(lèi)的屬性和方法或者重新定義、追加屬性和方法等。但是在Javascript中沒(méi)有類(lèi)的概念,是基于原型的語(yǔ)言,所以這就意味著對(duì)象可以直接...
閱讀 1216·2023-04-26 00:47
閱讀 3569·2021-11-16 11:53
閱讀 796·2021-10-08 10:05
閱讀 2740·2021-09-22 15:19
閱讀 2982·2019-08-30 15:55
閱讀 2756·2019-08-29 16:55
閱讀 2922·2019-08-29 15:20
閱讀 1112·2019-08-23 16:13