2012-03-21 56 views
6

我有OOP的背景。我開始用JavaScript工作了很多。隨着項目的發展,維護它變得越來越困難。在Java中,我應用OOP原則來控制事物。我應該怎麼處理JavaScript,我應該研究哪些旨在保持JavaScript應用程序的控制權?OOP vs JavaScript

+0

看看Backbone.js的,也許CoffeeScript的。他們一起工作得很好。 – asawyer 2012-03-21 20:09:37

+13

JavaScript是面向對象的。 – Gumbo 2012-03-21 20:09:58

+0

檢查出[helephant(http://helephant.com/2008/08/17/how-javascript-objects-work/)的一些OO的思想。的 – jbabey 2012-03-21 20:13:40

回答

6

您也可以將OOP原則應用於Javascript開發。 Javascript使用原型繼承,但這是一個實現細節。這些概念仍然是一樣的。大多數您熟悉的概念都有直接類似於javascript的概念。

其他嘗試和真正的方法也同樣適用:

1)保持乾爽 - 不要重複自己。重複的代碼總是邪惡的。
2)單獨問題 - 使用MVC或MVVM模式保持代碼清潔,只做1件事。
3)測試 - 當我聽到「難以維護」時,我的大腦將其轉化爲缺乏測試。您當然可以爲JavaScript項目編寫單元測試。
4)代碼審查 - 代碼審查可以是拒絕重複的代碼的好方法,代碼是不正確精雕細琢,未格式化,等....

+0

......好吧,夠近了。然而,這種區別很重要。這絕對值得長期關注。 – 2012-03-21 20:12:09

+0

你是什麼意思'夠接近'?你不同意嗎? – hvgotcodes 2012-03-21 20:28:21

+0

原型與子類不是同義的;領域和功能如何被「採用」有一些差異。例如,共享原型的多個對象字面上共享原型字段,並且更改它可以更改所有子對象的屬性。 – 2012-03-21 20:31:58

-1

在JavaScript中,函數是對象; Mozilla Developer Network,McKoss,SitePoint,JavaScript Kit進一步解釋。

實例JavaScript對象

function myObj() { 
    this.myMethod = function() { 
    alert('hello'); 
    } 
} 
var demo_obj = new myObj(); 
demo_obj.myMethod(); 

模式來控制住

反模式,以讓事情失去了控制

  1. 的污染命名空間
  2. 使用eval()
  3. 原型侵害的對象物體
  4. 聯腳本的標籤。
  5. 使用文件撰寫
+3

這是如何回答這個問題的? – delnan 2012-03-21 20:12:02

0

的當我在相同的情況下,我開始看「怎麼做等」。它以http://dojotoolkit.org/http://jquery.com結尾,我正在研究他們如何實現小部件/插件,以便其他人可以擴展該框架。

2

這是你如何在javascript中定義對象和方法。

function SomeObj() { 

    this.someMethod = function() { 
     alert('boo'); 
    } 
} 

var o_obj = new SomeObj(); 
o_obj.someMethod(); //alerts "boo" 

希望它有幫助。

您還可以使用原型創建靜態函數。

this.prototype.someMethod = function() { 
    alert('boo'); 
} 
+0

請在'someObj'中使用*第一個大寫字母*。它是JavaScript中的標準命名轉換。它表明應該用'new'來創建對象的實例。比較'var now = new Date();'。 – Oleg 2012-05-12 17:25:09

+0

的確如此。對象名稱甚至轉爲藍色,現在它們以大寫字母開頭。 – c0d3Junk13 2012-05-13 15:43:38

+0

我建議您另外使用http://www.jslint.com/來驗證代碼。你。你會看到''構造函數名'someObj'應該在你以前的代碼中以大寫字母'消息開頭。另外你會發現你應該包括';' 'this.someMethod = function(){alert('boo'); }因爲它是賦值語句。 – Oleg 2012-05-13 16:08:27

0

另一種在javascript中定義簡單對象和方法的方法(不需要new)。

function creaeSomeObj() { 
    var that = {}; 
    that.someMethod = function() { 
     alert('boo'); 
    } 
    return that; 
} 

var o_obj = createSomeObj(); 
o_obj.someMethod(); //alerts "boo" 

此模式不支持繼承,但多次就足夠了。

0

爲什麼「vs」? JavaScript支持面向對象的編程,但不是以傳統的基於類的方式,例如在例如Java的。

JavaScript的OOP工作方式通常稱爲「原型繼承」,或者更具體地說是「委託原型繼承」。這可以歸結爲:「如果你正在尋找一個對象的屬性‘富’,你不能找到它,然後嘗試尋找對象的原型而不是內部‘富’」。也就是說,該物業的查找是委託到對象的原型(我們說對象從原型繼承屬性)。

原型繼承的工作方式有幾點含義。例如:

  • JavaScript中的對象是「動態」的,因爲它們只是一堆名稱 - 值對。新的屬性可以在運行時添加和刪除,因此它們比典型的類對象中的「靜態」要少得多。
  • 方式delegative原型繼承的作品(「如果你不能找到原型這裏,再看看這裏代替」)意味着它比傳統的面向對象多簡單。例如,從純粹的原型角度來看,您不需要構造函數。 「方法」是指發生在連接到原型(這意味着它們可以作爲所有繼承對象的屬性)只是普通的功能。

有贊成的和反對的既原型和經典的繼承,但要記住,他們是不同是很重要的。現在

,JavaScript是由Java和其他古典語言啓發某種意義上,等於是他們決定把語法「類像」,使其更容易使用的類人上手。在這方面我不會詳細說明。它在很大程度上已經在其他地方被記錄。

一些有趣的帖子:

0

Pluralsight有一個關於此主題的課程:Structuring JavaScript Code,可能會提供一些見解。注意兩點:1,我沒有走過的歷程坐 - 但是內容很精彩,我一直印象深刻,我已經採取了其他Pluralsight課程,2。它不是免費的(但可能是值得的小$如果它可以節省您在B/C路上的時間,使您擁有更好的代碼結構)。不,我不爲Pluralsight工作。

除了這個線程提到的js框架,也可以看看Knockoutjs - 在這裏learnknockoutjs.com偉大的教程。 Knockout是MVVM的焦點。注意,存在計算器comparing Backbone to Knockout了很好的討論,並Pluralsight也有使用淘汰賽,我都看過,做推薦的課程。