1. 程式人生 > >constructor和object的聯系與對比

constructor和object的聯系與對比

fun 關系 undefine prot 全局 占用內存 修改原型 沒有 找對象

構造函數是類中的特殊成員函數,用於為對象分配內存。它可用於為數據成員提供值。創建對象時將調用構造函數。它與類具有相同的名稱。構造函數不返回任何值。

構造函數是生成對象的模板,一個構造函數可以生成多個對象,每個對象都有相同的結構。 構造函數的缺點就是,每當你實例化兩個對象時,需要調用兩次構造函數的某一個方法,這帶來的壞處就是占用內存,而且沒必要。
其次,為了解決構造函數的屬性和方法無法被對象實例所共享的問題,我們可以把需要共享的屬性和方法放在原型(prototype)對象上。原型對象上的所有屬性和方法,都會被對象實例所共享。對於構造函數來說,prototype是作為構造函數的屬性;對於對象實例來說,prototype是對象實例的原型對象。所以prototype即是屬性,又是對象。
然後,除了undefined和null之外,每一個數據類型都可以看成一個對象,每一個對象都有它的原型。所有一切對象的原型頂端,都是Object.prototype,即Object構造函數的prototype屬性指向的那個對象。當然,Object.prototype對象也有自己的原型對象,那就是沒有任何屬性和方法的null對象,而null對象沒有自己的原型。
原型鏈的特點有:
a:讀取對象的某個屬性時,JavaScript引擎先尋找對象本身的屬性,如果找不到,就到它的原型去找,如果還是找不到,就到原型的原型去找。如果直到最頂層的Object.prototype還是找不到,則返回undefined。
b:如果對象自身和它的原型,都定義了一個同名屬性,那麽優先讀取對象自身的屬性,這叫做“覆蓋”(overiding)。
c:一級級向上在原型鏈尋找某個屬性,對性能是有影響的。所尋找的屬性在越上層的原型對象,對性能的影響越大。如果尋找某個不存在的屬性,將會遍歷整個原型鏈。
再次,constructor屬性是原型對象上的一個屬性,可以被所有實例對象所共享。要註意的是,prototype是構造函數的屬性,而constructor則是構造函數的prototype屬性所指向的那個對象,也就是原型對象的屬性。由於constructor屬性是一種原型對象和構造函數的關系,所以在修改原型對象的時候,一定要註意constructor的指向問題。
最後,instanceof運算符返回一個布爾值,用於判斷對象是否為某個構造函數的實例。

任何函數都是構造函數,如果通過new就可以得到一個對象。通過函數不同的上下文調用分下面幾種:
(1). 當在一個函數調用之前有new關鍵字,則上下文為新建的對象;
//任何函數可以new 創建一個對象
(2). 當一個函數使用call或者apply調用時,給定的第一個參數即為上下文;
//構造方法中可以寫成員方法。然後通過對象來調用
(3). 否則,如果一個函數作為一個對象的屬性(obj.func)或者obj[‘func‘])來調用時,它就把該對象作為上下文來運行;
//上邊new fun2()沒意義,直接 fun2()調用,這裏在全局上下文運行
(4)如果與上述幾條都不符的話,則函數將在全局上下文中運行。

Constructor:是用於創建和初始化類中創建的一種特殊方法。constructor屬性返回對創建此對象的數組函數的引用。

object:object是js自帶的函數對象,可以有屬性和方法。

在定義以後,不能在使用new創建對象實例,可以復制給其他變量,多個變量同時引用一個對象,或者克隆對象。具有多態性,無法繼承,除非用復制的方式來實現。

轉載自https://home.cnblogs.com/u/lilinhan/

constructor和object的聯系與對比