2014-08-28 210 views
0

我想了解用對象構造函數創建對象的過程。什麼是對象構造函數?

閱讀我的javascript書籍,在線來源,MDN和MSDN後,我無法決定如何最好地定義對象構造函數。

function Person(first, last, age, eyecolor) { 
    this.firstName = first; 
    this.lastName = last; 
    this.age = age; 
    this.eyeColor = eyecolor 
} 

在上面的代碼,我應該想的對象構造方法爲:

  • 整個功能和所有與它去的代碼?
  • 只是函數「person()」
  • 或者它只是一個術語,給JavaScript引擎在內存中「創建」我的對象所做的任何事情?

看起來像使用對象構造函數創建對象就像創建一個對象模板一樣,您可以在以前定義的「對象模板」的基礎上創建對象的同時創建對象模板。

請隨意挑剔,幫我準確定義這個術語,並完全理解它。

+0

這是一個構造函數,當你創建一個'new'實例時它就成爲一個Object。 – PHPglue 2014-08-28 01:31:38

+2

按照慣例,構造函數名是大寫的,就像'Person'。這是一種記住在調用它時必須使用'new'的方法。 – Oriol 2014-08-28 01:32:10

+0

你也可以創建一個Object類型的new實例,如:if(!Object.create){Object.create = function(o){function F(){}; F。原型= o;返回新的F;}};'。現在只需使用var pers = {prop:'value'},newPers = Object.create(pers);'。當然,你不能將參數傳遞給對象。 – PHPglue 2014-08-28 01:44:06

回答

1

術語constructor functionobject constructor是指所有的代碼在你person功能預計此代碼將與一起使用0運算符,因此它將被賦予一個新的對象,this指向。這是一個JavaScript中的功能,旨在以某種方式使用。

值得理解的是,Javascript中的構造函數僅僅是一個普通日常函數,它被設計爲構造函數,並且被設計爲用new運算符調用。因爲它的設計是用new運算符來調用的,所以它假定給它一個品牌令人滿意的新對象this指向。

構造函數內部的代碼只需要做正確初始化對象所需的代碼。這可能是從無到有的頁面和代碼頁 - 這完全取決於應用程序。

構造函數的另一個強大的方面是你可以爲它們分配一個原型,並且通過這樣做,當JS引擎在傳遞它之前創建初始對象時,告訴JS引擎什麼樣的默認屬性關閉構造函數。

所以,在你的榜樣:

function Person(first, last, age, eyecolor) { 
    this.firstName = first; 
    this.lastName = last; 
    this.age = age; 
    this.eyeColor = eyecolor 
} 

您可以添加一些方法的原型:

Person.prototype = { 
    getFullName: function() { 
     return this.firstName + " " + this.lastName; 
    }, 
    incrementAge: function() { 
     ++this.age; 
    } 
}; 

現在,當你創建一個新的Person對象(我已經切換到大寫的是在Javascript中使用構造函數的慣例),您將得到一個具有代碼在您的構造函數中指定的屬性的對象,但它也將具有分配給原型的方法。

var p = new Person("Ted", "Williams", 39, "blue"); 
var fullname = p.getFullName(); // returns "Ted Williams" 

它一般是在Javascript更有效地使用的原型的方法,而不是由一個在構造函數中分配各方法之一,並提供原型一個用於繼承了。

+0

謝謝你的好消息@ jfriend00。所以你是說任何函數都可以「成爲」一個對象構造函數,如果它正在被'new'關鍵字調用?此外,我認爲'new'關鍵字是「真實」對象構造函數 - 或者至少'new'關鍵字是對象構造函數的先決條件嗎? – 2014-08-29 01:57:32

+0

@JonathonAndrews - 也可以創建一個新對象,而不使用'new'運算符,只需返回一個在該函數中創建的新對象的常規函數​​。這通常稱爲工廠函數,但與構造函數完成相同的功能。 – jfriend00 2014-08-29 03:46:50

0

我不確定'官方'的定義是什麼,但我認爲你所有的觀點都適用。對象構造函數本質上是一個「構造」對象的函數。它通過構造函數中的代碼來完成這個工作,它可以使用其他代碼(即:通過函數調用)來構造對象。從技術上講,對象構造者只是'功能person。但實際上,這個函數需要它內部的代碼才能工作,所以你不能忽略它。

另外,它是js中的命名自定義,用大寫字母命名Object構造函數。

function Person(first, last, age, eyecolor) { 
    this.firstName = first; 
    this.lastName = last; 
    this.age = age; 
    this.eyeColor = eyecolor; 
} 

var jim = new Person("Jimmy", "Smith", 22, "blue"); 

,如果你想知道更多,這些都是值得一讀:

0

「構造函數」是指函數服務的角色。所有的構造函數都是簡單的函數,任何函數都可以用作構造函數,調用new。構造函數是一個函數,它的意圖是讓它被new調用。

當一個函數被用作構造函數(即用new調用)時,被調用的函數將其this值設置爲新創建的對象。新創建的this對象是其原型鏈以被調用函數的值prototype開頭的對象(因此,對於新創建的this,這確實是this.__proto__ === person.prototype)。這意味着可以直接在新創建的對象上訪問person.prototype上的任何屬性或方法。

最後,如果構造函數沒有顯式返回一個對象,它將返回其新創建的this對象。

1

簡單地說,一個構造函數是一個構建給定類的對象的函數。例如,如果您有一個名爲Person的類,那麼以下代碼可以表示該類的參數化構造函數。

function Person(first, last, age, eyecolor) { 
     this.firstName = first; 
     this.lastName = last; 
     this.age = age; 
     this.eyeColor = eyecolor 
    } 

這裏我們有一個名爲Person的類的參數化構造函數。構造函數被稱爲「參數化」構造函數,因爲我們正在傳入參數,在這種情況下是4個名爲first,last,age和eyecolor的參數。構造函數接受這4個值併爲構建的對象設置firstName,lastName,age和eyeColor字段。

在程序中創建對象時,始終會調用默認構造函數。這個參數化的構造函數允許我們在創建時使用默認值構建一個對象,而不是像缺省構造函數那樣將它們設置爲默認值。

相關問題