2013-10-18 60 views
0

我見過一些人方法添加到對象類,像這樣:Javascript:向對象類添加方法有什麼優點/缺點?

Object.clone = function() { 

} 

這是語法,就像任何其他函數名只用一段或這實際上增加了Object類?這與原型方法相同嗎?做這個(或使用一個原型)與做一個函數克隆有什麼區別?

+0

有人說修改原型對象如'Object'並不明智,有人說沒關係。如果其他庫也修改這些對象,則可能會遇到問題。 (也開始倒計時,直到這個問題關閉爲基於意見/無損) – Jared

+0

「有些人」:爲什麼? –

+0

這個東西叫做'Object'全局構造函數。它是標準的內置構造函數之一。這不是一堂課。 –

回答

2

在JavaScript中一切都是對象,這意味着你可以附加屬性的任何對象,就像你會與一個對象文本,例如:

var arr = [1,2,3]; 
arr.property = 'foo'; 

這是不好的做法,對非這樣做盡管如此。

每個對象都有一個構造函數,所以數組有Array構造,對象有一個Object構造器等對象的prototype是一個對象,其背景是實例,當你實例化這個發生在自定義對象new

當您將方法附加到prototype時,它將在該對象的所有實例之間共享。當你將一個函數附加到構造函數中時,你基本上隱藏了一個名字空間下的全局函數(取決於範圍);上下文不是實例,它不依賴於實例。你可以將這些函數看作靜態方法。

擴展Object.prototype很麻煩,因爲這是「母對象」。擴展Object構造函數本身並不壞,但不是最佳實踐。最好的解決方案,就是創建你自己的名字空間:

var MY = {}; 

MY.clone = function(){}; 
+0

我明白了。我懂了。謝謝! –

+0

還有一件事:如果我有函數clone()並且第三方腳本以某種方式定義了該方法,是否會有衝突。這是使用「MY.clone」的原因嗎? –

+1

如果它在全球範圍內,是的,會有衝突。 'MY'總是安全的,假設'MY'是唯一的(或者儘可能唯一)。 – elclanrs

1

無需爲內置的Object構造函數添加靜態函數。如果您這樣做,還存在代碼健壯性方面的問題,因爲一些當前和未來的環境可能會引入同名的內置方法,然後出現名稱衝突。

只需將您的方法添加到您自己的對象。

+0

好吧,但是你的意思是「你自己的物體」。這些是克隆和合並對象等基本功能。 –

+1

@JohnSmith'var John = {}; John.merge = function(){...}; John.clone = function(){...};' –

相關問題