2014-03-14 116 views

回答

26

構造函數是一個正常的函數。

這裏的區別在於使用new運算符,它使函數中的上下文(this)成爲新實例,從而讓它使用這兩個屬性並返回此新實例。

沒有new操作,上下文將是外部一個(window如果你的代碼是在鬆散模式在全球範圍內,如果undefined在嚴格模式)。

也就是說,如果省略new

var catC = Cat("Fluffy", "White"); 

功能 「作品」(如果你在嚴格模式不是),但你有兩種不同的結果:

  • catCundefined因爲你的函數什麼都沒有返回
  • namecolor現在屬性的外部範圍

全魔,因此,在the new operator

當執行代碼的新富(...),下面的事情發生:

一個新的對象被創建,繼承來自foo.prototype。

構造函數foo被調用時指定的參數和 綁定到新創建的對象。新foo相當於新的 foo(),即如果未指定參數列表,則會調用foo而不使用 參數。

構造函數返回的對象成爲整個新表達式的 結果。如果構造函數 未明確返回對象,則在步驟1中創建的對象替代地使用 。 (通常構造函數不返回值,但他們 可以選擇這樣做,如果他們想覆蓋普通對象 創建過程。)

當我說這是一個正常的功能我,我略一件事:開發者的意圖。您通常將函數定義爲被稱爲構造函數(即與new)或不被調用。在第一種情況下,您經常使用參數來初始化實例的字段(使用this.name = ...),並且您經常通過向原型添加函數(如您所做的那樣),以便它們可用於所有實例。爲了明確你的意圖,習慣上以大寫字母開頭來命名你的構造函數。

+1

另外,按照慣例,一個構造函數是大寫。 –

+1

也就是說,一個用作構造函數的函數通常最初被封頂。 –

+0

@DavinTryon取決於。我確實利用了我的構造函數,但這不是一個普遍的約定。例如,查看我鏈接到的MDN頁面的示例。 –

1

在面向對象編程中,類中的構造函數是調用來創建對象的特殊類型的子例程。它準備要使用的新對象,通常接受構造函數用來設置所需成員變量的參數。

所以var catC = new Cat("Fluffy", "White");創建構造類Cat

2

Dystroy有它的一個新的實例。

說它的另一種方式,是功能成爲一個「構造」,當它被調用與new操作構建一個新的類實例。

這也是被提及的,讓其他開發者可以看到它是一個構造函數名的資本慣例的原因,那就是落在與命名的classes

+0

*大寫字母(駝峯) –

3

讓我們對目前的公約舉一個例子來理解Javascript中構造函數的誕生。假設,你被要求創建一個員工對象,它應該有4個屬性firstName,lastName,gender和名稱。好!你說沒問題。

var employee1={}; 
employee1.firstName="Anoop"; 
employee1.lastName="Rai"; 
employee1.gender="M"; 
employee1.designation="Software Engineer"; 

以上是最簡單的方法,首先創建空的對象,然後將相關的所有4個屬性的對象(當然,你可以有也創造了通過行內相同)。如果再次要求您使用相同的屬性創建另一個員工對象,該怎麼辦?

var employee2={}; 
employee1.firstName="Ram"; 
employee1.lastName="Kumar"; 
employee1.gender="M"; 
employee1.designation="Associate Software Engineer"; 

似乎沒有問題。現在,如果您被問及總共有100名員工並且您剛剛創建了2名員工,那麼通常您需要創建另外98名員工對象。現在你不會像上面那樣創建對象,因爲它看起來很乏味。疑難雜症!讓我們創建一個將被調用任意次數的工廠方法,它將創建對象然後將其返回給我們。是啊!寫一次,將被使用很多次。

function createEmployeeObject(firstName, lastName, gender, designation){ 
    var employee={}; 
    employee.firstName=firstName; 
    employee.lastName=lastName; 
    employee.gender=gender; 
    employee.designation=designation; 
    return employee; 
} 

var employee3=createEmployeeObject("Harry", "Dsouza", "M", "Project Manager"); 

非常方便,沒有任何重複的代碼。只需用你的參數調用createEmployeeObject函數,並返回你的對象。如果我們有幾種類型的對象說部門怎麼辦?然後我們也會有一個函數來創建一個部門對象並返回它。

因此,這些功能中常見的是什麼。它是: -

  1. 創建空對象

    變種MyObj中= {};

  2. 填充它

    返回MyObj中之後返回對象;

創建空對象和返回對象在所有創建對象的函數中是通用的。 Javascript創建了一個快捷方式,當您使用創建對象的函數時,可以不寫這些行。所以,這兩行可以跳過。這樣做的方法是使用構造函數。

使用函數創建對象在Javascript中相當普遍,所以Javascript提供了一個快捷方式,可以讓您編寫用於創建對象的函數。這些特殊功能稱爲構造函數。構造函數是讓您填充需要創建的對象的函數。

function createEmployeeObject(firstName, lastName, gender, designation){ 
    this.firstName=firstName; 
    this.lastName=lastName; 
    this.gender=gender; 
    this.designation=designation; 
} 
var employee4=new createEmployeeObject("Alan", "Marks", "F", "Business Analyst"); 

你必須瞭解這個關鍵字它指向當前object.Remember,在構造函數的Javascript爲我們創建空的對象,所以實際上僅指向該對象。 Javscript Construtor函數在填充後自動返回對象。現在,如何告訴Javascript一個函數在構造函數模式下被調用,它是一個新的關鍵字,它告訴Javascript將函數作爲構造函數處理。每次你需要一個對象,使用新的關鍵字,然後調用一個函數,然後該函數爲我們準備一個對象並返回它。

即使Javascript不是基於類的,您必須照顧構造函數名稱。使用駱駝案件並不好,使用常規案件。

function Employee(firstName, lastName, gender, designation){ 
    this.firstName=firstName; 
    this.lastName=lastName; 
    this.gender=gender; 
    this.designation=designation; 
} 
var employee5=new Employee("Mark", "Watson", "M", "DBA"); 

http://jkoder.com/javascript-constructors-why-it-should-be-used-object-oriented-programming-in-javascript/

+0

不錯,很好,清楚地解釋:) –

相關問題