2011-07-09 25 views
2

我不喜歡javascript的一件事是有數百種方法可以做事。我想知道的是,我如何申報班級?我使用函數()方法嗎?我打電話給Class.create()嗎?什麼是「標準做法」?聲明成員函數的'標準實踐'是什麼?我使用原型嗎?我使用myClass.method()嗎?最後,我該如何做基本的親子繼承?我問的原因是因爲在互聯網上我收到了很多方法來做這些事情。我想知道什麼是'標準做法'。如何在JavaScript中聲明父類和子類?

+5

標準做法是JavaScript沒有類。 – kennebec

回答

1

在Javascript中聲明類,尤其是子類時沒有「標準實踐」的原因是,JavaScript實際上並沒有內置的語法支持,可以在C++中找到典型的類。相反,它有它自己的一竅門,用於生成類似的功能,並且有很多不同的方式來表達這些技巧。實際上沒有標準的方法。

我覺得最好使用一個更常見的JavaScript庫(jQuery,Prototype,YUI,Closure等),然後使用它們提供的子函數提供的函數,這將爲您提供您自己的「標準「這樣做的方式。如果你不想使用其中的一個庫,那麼你需要從某個地方借用一些代碼進行子分類(相當於YUI的extend()函數),然後決定要使用的風格。

我個人認爲這是Javascript在大型項目中的一個弱點,有多個人正在從事這些項目的項目或其他項目意圖由其他人擴展的項目,因爲沒有語言語法來聲明類和子類的「途徑」。相反,擁有一致的代碼庫的唯一方法是自己決定要使用的聲明風格,然後將其作爲項目中的編碼標準強制執行,就像使用支架樣式或縮進樣式。

1

我的建議是你讀Stoyan Stefanov的JavaScript Patterns。他詳細介紹了這一主題。我個人很喜歡Module Pattern。它減少了全球空間污染,並且易於使用。

編輯:實例化他們的 「類」 時

其他的答案離開了new關鍵字。請參閱回答383503以獲得有關正確實例化JavaScript「類」的詳細討論。

1

絕對同意其他海報上沒有你所描述的「標準做法」。我將分享我現在使用的東西,這與道格拉斯克勞福德在他的書The Good Parts中使用的相似。我並不是說它是完美的,但是我很長時間都對這個問題感到沮喪,當我正在尋找以OOP方式組織JS代碼時,這對我來說工作得很好。

var ParentClass = function() { 
    var my = {}, // store private member variables and functions 
    that = {}; // store public member variables and functions 
    my.privateVar = 0; 
    that.publicVar = 7; 

    // this won't be visible outside of parent class, 
    // even to children unfortunately 
    my.getPrivateVar = function() { 
    return my.privateVar; 
    }; 

    my.privateFunction = function() { 
    // do stuff 
    }; 

    // this will be visible to children classes and anyone 
    // else using ParentClass 
    that.parentFunction = function() { 
    // here we can access private vars and functions 
    my.privateVar++; 
    my.privateFunction(); 
    }; 

    // and here we return the object that we created 
    // to store the public member variables and functions 
    return that; 
}; 

var ChildClass = function() { 
    var my = {}, // more private vars and functions will live here 
    that = ParentClass(); // and here we subclass ParentClass; 

    // here define more public, private methods as before 
    that.childFunction = function() { 
    }; 

    return that; 
}; 

// test drive it 
var cc = ChildClass(); 
cc.parentFunction(); 
cc.childFunction(); 
console.debug(cc.publicVar); 
// console.debug(cc.privateVar); // undefined