2016-09-18 74 views
0
function Circle(radius) { 
    this.radius = radius; 
} 

我想通過玩控制檯來了解對象和原型。當我嘗試「圈」,它給了這個功能。但是,當我試圖Circle.prototype它給了一個對象。 Circle如何獲得原型屬性。它有構造函數和Object的原型。有些人能解釋這種層次結構函數原型是如何創建的?

enter image description here

+0

'.prototype'總是存在,因爲它是一個對象。 – zerkms

+0

https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Inheritance_and_the_prototype_chain – Mchl

+0

但是Circle是功能? –

回答

0

要使用你的代碼來創建一個圓,你會如果你想要那個圈子後,var circ = new Circle(10);使用使用new Circle(10);,或。這將創建一個新的圓形對象供您隨意使用。

Circle是一個函數,另一種變量或對象。您設置了Circle,現在當您鍵入Circle時,它將返回該函數本身。不是一個新的圈子。每一個功能都有一些屬性,而prototype就是其中之一。

prototype對象是每個函數的一部分,用於處理類。你可以閱讀關於它here

2

當您創建新的函數時,JS將創建具有屬性名稱,長度和原型的新函數對象。名稱是函數名稱,長度是參數數量,原型是對JS對象創建的引用第一個函數對象的構造函數屬性的引用。所以當你創建一個函數時,你實際上創建了2個新的對象,函數對象和原型對象。

欲瞭解更多信息,請參閱本30分鐘講座:

http://www.objectplayground.com/

如果你只想在功能部分,轉到分鐘16:40。

0

在Javascript中,函數是一個對象。每個對象都有一個「祕密」原型屬性。 在你的情況下,Circle的原型是Function的原型,因爲Circle是一個函數。 每個對象派生自的根對象都是Object對象,因此如果您可以沿着原型鏈走直到到達Object對象。 如果您打算使用Cirle作爲構造函數並用new來調用它,這意味着您將創建其他將成爲Circle實例的對象,並且其原型將指向Circle.prototype。 有關原型如何工作的更詳細說明,網上有非常好的資源。 例如,您可以閱讀:http://eloquentjavascript.net/關於數據結構的章節:對象和數組。

您可以通過執行Object.getPrototypeOf(Circle)來檢查Circle的原型,以確認這將是Function原型。

+0

這是正確的,但現在OP在詢問什麼。 – Bergi

1

我認爲當你讀到有人寫「每個物體都有一個原型屬性」時,就會產生誤解。

函數在Javascript中是對象。和每個對象一樣,函數有一些屬性和方法,其中一些是默認定義的:length屬性,prototype屬性,call()apply()和bind()方法等等。因此,一個函數有一個原型屬性,默認情況下

function myfunc(){ 
    return "yes I'm a function"; 
} 

//I said that function are objects having properties and methods 
//this means you can call them, for example 
myfunc.prototype 

,你會看到你從調用該物業的回報有值是一個對象。好的,現在就到此爲止了。現在

,你可以使用任何功能作爲一個構造函數,這樣你就可以用new關鍵字

var myobj = new myfunc() 

共同創造一個新的對象調用的函數,你將有一個新的對象。這個對象還沒有默認

myobj.proptotype //=> unefined 

我們不能說一個原型屬性對象的原型屬性:函數都有一個原型屬性,對象沒有。

但是,每個對象都與一個原型對象相關聯,從中繼承了屬性和方法。你想看看原型對象的價值是什麼?其中一個解決方案是

myobj.__proto__ 

您將看到自定義對象的原型對象的值。

現在,看看myobj.__proto__的值和myfunc.prototype的值:它們是相同的。這只是意味着構造函數的原型屬性(換句話說,爲了創建新對象而使用關鍵字new使用的函數的原型屬性)將用作新對象的原型。

請牢記這一點。

函數是對象,所以函數默認具有屬性和方法。

函數有一個原型屬性。

您可以使用函數作爲構造函數來創建新的對象。

對象還沒有一個原型屬性。

對象有一個原型對象。

原型對象的值與構造函數的prototype屬性相同。