我見過一些人方法添加到對象類,像這樣:Javascript:向對象類添加方法有什麼優點/缺點?
Object.clone = function() {
}
這是語法,就像任何其他函數名只用一段或這實際上增加了Object類?這與原型方法相同嗎?做這個(或使用一個原型)與做一個函數克隆有什麼區別?
我見過一些人方法添加到對象類,像這樣:Javascript:向對象類添加方法有什麼優點/缺點?
Object.clone = function() {
}
這是語法,就像任何其他函數名只用一段或這實際上增加了Object類?這與原型方法相同嗎?做這個(或使用一個原型)與做一個函數克隆有什麼區別?
在JavaScript中一切都是對象,這意味着你可以附加屬性的任何對象,就像你會與一個對象文本,例如:
var arr = [1,2,3];
arr.property = 'foo';
這是不好的做法,對非這樣做盡管如此。
每個對象都有一個構造函數,所以數組有Array
構造,對象有一個Object
構造器等對象的prototype
是一個對象,其背景是實例,當你實例化這個發生在自定義對象new
。
當您將方法附加到prototype
時,它將在該對象的所有實例之間共享。當你將一個函數附加到構造函數中時,你基本上隱藏了一個名字空間下的全局函數(取決於範圍);上下文不是實例,它不依賴於實例。你可以將這些函數看作靜態方法。
擴展Object.prototype
很麻煩,因爲這是「母對象」。擴展Object
構造函數本身並不壞,但不是最佳實踐。最好的解決方案,就是創建你自己的名字空間:
var MY = {};
MY.clone = function(){};
我明白了。我懂了。謝謝! –
還有一件事:如果我有函數clone()並且第三方腳本以某種方式定義了該方法,是否會有衝突。這是使用「MY.clone」的原因嗎? –
如果它在全球範圍內,是的,會有衝突。 'MY'總是安全的,假設'MY'是唯一的(或者儘可能唯一)。 – elclanrs
無需爲內置的Object
構造函數添加靜態函數。如果您這樣做,還存在代碼健壯性方面的問題,因爲一些當前和未來的環境可能會引入同名的內置方法,然後出現名稱衝突。
只需將您的方法添加到您自己的對象。
好吧,但是你的意思是「你自己的物體」。這些是克隆和合並對象等基本功能。 –
@JohnSmith'var John = {}; John.merge = function(){...}; John.clone = function(){...};' –
有人說修改原型對象如'Object'並不明智,有人說沒關係。如果其他庫也修改這些對象,則可能會遇到問題。 (也開始倒計時,直到這個問題關閉爲基於意見/無損) – Jared
「有些人」:爲什麼? –
這個東西叫做'Object'全局構造函數。它是標準的內置構造函數之一。這不是一堂課。 –