2012-12-02 40 views
1

可能重複的原型功能之間的區別:
Use of ‘prototype’ vs. ‘this’ in Javascript?
Defining prototype methods inside the constructor是什麼內部或「類」的定義之外

是有這兩個定義之間有什麼區別?

function Task(description, value) { 

    this.id = 0; 
    this.subId = 0; 
    this.parent = null; 
    this.children = new Array(); 

    this.description = description; 
    this.value = value; 

    Task.prototype.getNextId = function() { 
     return this.subId++; 
    }, 

    Task.prototype.addTask = function (task) { 
     task.id = this.getNextId(); 
     this.children[task.id] = task; 
     task.parent = this; 
    }, 

    Task.prototype.remove = function() { 
     this.parent.children.remove(this.id); 
    } 

} 

所有原型方法都在Task定義中,或者?

function Task(description, value) { 

    this.id = 0; 
    this.subId = 0; 
    this.parent = null; 
    this.children = new Array(); 

    this.description = description; 
    this.value = value; 

} 

Task.prototype.getNextId = function() { 
    return this.subId++; 
}, 

Task.prototype.addTask = function (task) { 
    task.id = this.getNextId(); 
    this.children[task.id] = task; 
    task.parent = this; 
}, 

Task.prototype.remove = function() { 
    this.parent.children.remove(this.id); 
} 

我不確定是否有差別。從OOP的角度來看,內部定義看起來更好。

謝謝!

+3

[在構造函數中定義原型方法](http://stackoverflow.com/questions/7115594/defining-prototype-methods-inside-the-constructor)應該回答你的問題(或至少幫助理解差異) 。 –

+0

每次調用構造函數時都會執行「inside」,因此您不想將原型方法定義放在那裏。把它的膽量掛起來是JavaScript「classes」的商標:P' –

+0

@DCoder,我不這麼認爲。他在詢問如何在構造函數內部或外部放置原型方法;我不明白這是如何「涉及」的。 – jrajav

回答

0

每次構造函數被調用時,第一個函數都會分配原型函數。因此,如果您稍後將其他位置重新分配,則只要您構建該類型的另一個基礎對象,就會再次覆蓋它們。這幾乎總是不受歡迎的。

查看這個問題進行更詳細的討論:Defining prototype methods inside the constructor

0

構造的prototype是從構造創建的實例之間共享的對象。

如果更新構造函數中的prototype對象的屬性,那麼共享該原型對象的所有實例都將引用最新的更新。

在你的代碼中,你不會注意到一個區別,但它仍然是錯誤的。不需要用新的相同版本覆蓋原型功能。

如果您的代碼發生更改以便添加到prototype的函數引用構造函數中的局部變量,則所有實例最終將使用引用最新調用中的變量的prototyped函數。這幾乎不是你想要的。

如果您的代碼發生變化以便構造函數的整個原型對象被覆蓋,則每個創建的實例都將引用不同的原型對象,並且您將無法通過添加新方法來更新所有實例的原型到Task.prototype,因爲它只是更新最近實例的原型對象。

相關問題