2012-09-27 37 views
6

在JavaScript中,每個函數的原型對象都有一個不可枚舉的屬性constructor,它指向函數(EcmaScript §13.2)。這是不以任何原生功能(例如僅instanceof檢查原型鏈)中使用,但我們are encouraged to adjust it重寫功能的prototype財產繼承時:什麼是`constructor`屬性真的用於?

SubClass.prototype = Object.create(SuperClass.prototype, { 
    constructor: {value:SubClass, writable:true, configurable:true} 
}); 

但是,難道我們(包括我在內),這樣做只爲了清晰和整潔?是否有任何真實世界的用例依賴於constructor property

+0

什麼是我的理解構造函數屬性用於查看某個特定對象是由哪個函數構造函數創建或構造的。 – Apurv

+0

相關:[Javascript中的構造函數屬性是否有很好的用例?](http://stackoverflow.com/questions/8073867/is-there-a-good-use-case-for-the-constructor-property -in-javascript),儘管答案沒有幫助 – Bergi

+0

另請參見:[爲什麼需要設置原型構造函數?](http://stackoverflow.com/q/8453887/1048572) – Bergi

回答

2

我實在看不出爲什麼constructor屬性是它是JS。我偶爾發現自己使用它來獲取對象的原型(如事件對象)在IE < 9。但是我認爲它的存在,讓一些PPL模仿經典OO編程結構:

function Foo() 
{ 
    this.name = 'Foo'; 
} 
function Bar() 
{ 
    this.name = 'Bar'; 
} 
function Foobar(){}; 
Foo.prototype = new Foobar; 
Foo.prototype.constructor = Foo; 
Bar.prototype = new Foobar; 
Bar.prototype.constructor = Bar; 
var foo = new Foo(); 
var bar = new Bar(); 
//so far the set-up 
function pseudoOverload(obj) 
{ 
    if (!(obj instanceof Foobar)) 
    { 
     throw new Error 'I only take subclasses of Foobar'; 
    } 
    if (obj.constructor.name === 'Foo') 
    { 
     return new obj.constructor;//reference to constructor is quite handy 
    } 
    //do stuff with Bar instance 
} 

所以據我所知中,「後發優勢」的constructor屬性的是:

  • 從實例實例化新對象容易
  • 能夠你的對象爲certa的是子類在課堂上,但仍然能夠檢查你正在處理的特定類型的子類。
  • 正如你所說:整潔。
0

我的理解構造函數屬性用於查看某個特定對象是由哪個函數構造函數創建或構造的。

這是同一個很好的例子: http://www.klauskomenda.com/code/javascript-inheritance-by-example/

+0

該文章不使用'constructor'屬性。您可能想閱讀http://joost.zeekat.nl/constructors-considered-mildly-confusing.html以瞭解我所要求的:-) – Bergi

+0

對不起,我的意思是原型..我的不好:) – Apurv

相關問題