摘要:對象的定義無序屬性的集合屬性的值可以是基本值對象或者函數每個對象都是基于一個應用類型創建的這個引用類型可以是內置的例如也可以是用戶自定義的基于創建對象所有的對象都是繼承自的因此我們可以從著手創建對象通過關鍵字創建對象通過對象字面量創建對象基
對象的定義:無序屬性的集合,屬性的值可以是基本值、對象或者函數.
每個對象都是基于一個應用類型創建的,這個引用類型可以是內置的(例如Object Array Math),也可以是用戶自定義的.
所有的對象都是繼承自Object的,因此我們可以從Object著手創建對象.
//通過new 關鍵字創建對象 var person = new Ojbect(); person.name = "yuhualinfeng"; person.age = 30; person.job = "web developer"; //通過對象字面量創建對象 var person = {}; person.name = "yuhualinfeng"; person.age = 30; person.job = "web developer";
基于Object創建對象有兩種形式,一種是使用new關鍵字,另一種是使用對象字面量.
使用這種方式創建對象的缺點是:當創建多個相同類型的對象時,會產生許多重復的代碼,假如我要三個person對象,我就需要寫三相同結構的代碼,為了解決這個問題,我們引入了工廠模式創建對象.
工廠模式是軟件工廠領域一種廣為認知的設計模式,這種模式抽象了創建具體對象的過程.
function createPerson(name,age,job){ var obj = new Object(); obj.name = name; obj.age = age; obj.job = job; return obj; } var person1 = createPerson("yuhualingfeng",30,"web developer"); var person2 = createPerson("obama",45,"president");
我們創建了兩個人物對象,假如我們基于Object創建對象,那么createPerson內的代碼就會重復編碼.
但是使用這種模式創建的對象任然有一個問題:無法得知創建的對象的類型名.解決這問題的可行方法是使用構造函數創建對象.
function Person(name,age,job){ this.name = name; this.age = age; this.job = job; this.sayName = function(){ alert(this.name); } } var person1 = new Person("yuhualingfeng",30,"web developer"); var person2 = new Person("obama","45","president");
這里我們創建了一個名為Person的引用類型,然后我們用new 關鍵字實例化此引用類型,這個過程可以細化為以下四個過程:
創建一個新對象
將構造函數的作用域賦值給新函數(因此this就指向這個新對象)
執行構造函數中的代碼(為this對象賦值,等同于為新對象賦值)
返回新對象
我們可以用instanceof來檢測person1,person2的對象類型是否為Person.
alert(person1 instanceof Person); //true alert(person2 instanceof Person); //true alert(person1 instanceof Object); //true 因為Person繼承自Object,所以這里一樣成立.
注:細心的朋友應該會注意到,這里的構造函數的首字母是大寫,這里們遵循一個規范,普通函數的首字母大寫,普通函數的首字母小寫.
構造函數也有自己的缺點,大家可以看到Person包含一個sayName的函數(方法),函數也是對象(函數式Function的實例),所以每實例化一個Person,就會產生一個sayName方法,也就是一個對象,
隨著創建的person實例怎多,產生的對象也相應增多,最終導致更多的內存,那么我們能不能找到更好的解決辦法呢,答案是肯定的.
我們每創建一個函數都有一個prototype(原型)屬性,這個屬性是一個指針,指向一個對象而這個特定對象的用途是包含可以由特定類型的所有實例共享的屬性和方法.這就意味著原型對象不會因為實例的增多二占用
更多的內存.每個原型對象都默認有一個constructor屬性,故名思議,這個屬性指向構造函數.下面展示了通過原型對象來創建對象.
function Person(){ } Person.prototype.name = "yuhualingfeng"; Person.prototype.age = 30; Person.prototype.job = "web developer"; Person.prototype.sayName=function(){ alert(this.name); }; var person1 = new Person(); person.sayName(); //yuhualingfeng var person2 = new Person();
這里Person.prototype.constructor指向的是Person.當然你也可以向下面這樣直接給原型對象賦值來創建對象.
Person.prototype={ constructor:Person, name:"yuhualingfeng", age:30, job:"web developer" };
這里之所以添加了constructor屬性是應為直接給原型對象賦值會把原型對象的指針指向另一個對象,以前默認的值將無法訪問到.
順便給大家介紹兩個與原型對象相關的方法和in關鍵字:
isPrototypeOf:判斷是某對象否為實例的原型.
alert(Person.prototype.isPrototypeOf(person)); //true
hasOwnProperty:檢測某屬性是存在于實例中,還是原型對象中.
alert(person1.hasOwnProperty("name")); //false,因為屬性存在于原型中.
in操作符:in操作符有兩種使用方式,一種是多帶帶使用,一種是和for搭配使用,多帶帶使用的作用是判斷某屬性是否在某實例中訪問到(無論是在實例自身的還是原型對象中的),for-in是枚舉(循環)中使用.
//判斷屬性是否存在原型中 function hasPrototypeProperty(object,name){ return object.hasOwnProperty(name) && (name in object); }
原型模式創建對象的缺點:實例的原型對象是共享的,當修改一個實例的屬性,如果屬性的值為方法或者基本類型時,不會有什么影響,當屬性為引用類型時,會影響其他實例的屬性值.
綜合構造函數模式和原型模式創建對象,我們結合他們的優點,去粗取精,我們組合使用構造函數模式原型模式.
通過構造函數創建對象的缺點是每個方法都會在實例上重新創建,造成不必要的內存消耗;通過原型創建對象的缺點在于實例引用類型值的屬性會相互影響.綜上考慮,我們可以把存儲值得屬性放在構造函數中,把方法放在原型對象中.這種模式是創建對象使用最廣泛的一種,可以說是創建對象的默認模式.
function Person(name,age,job){ this.name = name; this.age = age; this.job = job; } Person.prototype = { constuctor:Person, sayName:function(){ alert(this.name); } }; var person = new Person("yuhualingfeng",30,"web developer"); person.sayName();
以上就是創建對象的幾種模式,大家可以結合它們的優缺點和你自身創建對象的用處進行權衡,然后選擇適合你的創建對象的模式.
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/86014.html
摘要:用代碼可以這樣描述安全到達國外面向過程既然說了面向對象,那么與之對應的就是面向過程。小結在這篇文章中,介紹了什么是面向對象和面向過程,以及中對象的含義。 這是 javascript 面向對象版塊的第一篇文章,主要講解對面向對象思想的一個理解。先說說什么是對象,其實這個還真的不好說。我們可以把自己當成一個對象,或者過年的時候相親,找對象,那么你未來的老婆也是一個對象。我們就要一些屬性,比...
摘要:很多情況下,通常一個人類,即創建了一個具體的對象。對象就是數據,對象本身不包含方法。類是相似對象的描述,稱為類的定義,是該類對象的藍圖或原型。在中,對象通過對類的實體化形成的對象。一類的對象抽取出來。注意中,對象一定是通過類的實例化來的。 showImg(https://segmentfault.com/img/bVTJ3H?w=900&h=385); 馬上就要到七夕了,離年底老媽老爸...
摘要:很多情況下,通常一個人類,即創建了一個具體的對象。對象就是數據,對象本身不包含方法。類是相似對象的描述,稱為類的定義,是該類對象的藍圖或原型。在中,對象通過對類的實體化形成的對象。一類的對象抽取出來。注意中,對象一定是通過類的實例化來的。 showImg(https://segmentfault.com/img/bVTJ3H?w=900&h=385); 馬上就要到七夕了,離年底老媽老爸...
摘要:很多情況下,通常一個人類,即創建了一個具體的對象。對象就是數據,對象本身不包含方法。類是相似對象的描述,稱為類的定義,是該類對象的藍圖或原型。在中,對象通過對類的實體化形成的對象。一類的對象抽取出來。注意中,對象一定是通過類的實例化來的。 showImg(https://segmentfault.com/img/bVTJ3H?w=900&h=385); 馬上就要到七夕了,離年底老媽老爸...
摘要:面向對象之四創建特定對象的語法糖個人學習筆記分享為了講清楚面向對象實際上是需要幾個前置知識的。于是之父創造了這個語法糖。 JS面向對象之四 【new】 (創建特定對象的語法糖) 個人學習筆記分享 為了講清楚面向對象,實際上是需要幾個前置知識的。包括前面的幾篇文章【原型鏈】 【this】 和今天要說的【new】 還是先說結論: new只是一個語法糖,這個語法糖被設計出來,使用場景是批量創...
摘要:可以用刪除實例對象中自己添加的屬性可以確定屬性是原型中還是實例對象中,當時實例對象中時,返回的是操作符,有兩種使用方式,單獨使用和循環中。單獨使用,通過對象能夠訪問屬性時返回,無論時在原型中還是實例對象中。 原型模式,每個創建的對象都有一個prototype屬性,這個屬性是一個指針,指向一個對象,而這個對象的用途是包含可以由特定類型的所有實例共享的屬性和方法。 ------------...
閱讀 1949·2023-04-26 01:59
閱讀 3264·2021-10-11 11:07
閱讀 3295·2021-09-22 15:43
閱讀 3374·2021-09-02 15:21
閱讀 2549·2021-09-01 10:49
閱讀 901·2019-08-29 15:15
閱讀 3089·2019-08-29 13:59
閱讀 2829·2019-08-26 13:36