2012-02-09 18 views
3

在我的代碼使用這種結構的許多功能:javascript樣式 - 我應該定義變量/類嗎?

options = {"param1": "yes", "param2" : "no"} 

在JS我沒有「界定」這樣的結構,因爲它是一種動態語言。

但是,當我知道結構具有固定的一組字段時,是否以一種集中的方式聲明它是最好的做法,只是爲了清楚?在類中的本地數據成員中使用也是一樣。以ctor或其他集中方式(清晰)初始化所有這些是最佳做法嗎?

我知道我可以在評論中做到這一點,但來自靜態語言我想知道什麼是JavaScript風格。

回答

2

(我希望你常上的這一點。:-)前有var沒有一個,你墮入The Horror Of Implicit Globals。)

沒有什麼比被明確沒有實際的約定。對於,「被澄清」是指兩件事情:

  1. 把所有var語句在範圍的開始,因爲that's where they really are anyway

  2. 如果某件東西具有不會有太大變化的重要結構,則儘可能早地將其與對象字面量相關聯(如您所知)。

......但「清楚」對不同的人意味着不同的事物。

這同樣適用於本地數據成員在類中的使用。以ctor或其他集中方式(清晰)初始化所有這些是最佳做法嗎?

是的,初始化構造函數中所有特定於實例的屬性。該物體可能不需要它自己的副本屬性可以駐留在原型:

function Foo(bar) { 
    this.bar = bar; 
    this.baz = []; 
} 
Foo.prototype.datum = 42; 

還有,通過new Foo("x")創建一個對象會得到其自己財產bar與價值"x",這是自己財產baz其值爲[],以及具有值42的繼承財產datum。將這些初始化置於構造函數和其旁邊的原型中可以幫助清晰起見。

1

如果你使用函數定義,通常你可以做更多的事情,以矩形爲例。

function Rectangle(width, height){ 
    this.width = width; 
    this.height = height; 
}; 

Rectangle.prototype.width = 0; 
Rectangle.prototype.height = 0; 
Rectangle.prototype.getArea = function(){ 
    return this.height * this.width; 
} 

var rect = new Rectangle(100, 50); 

console.log(rect.width); 
console.log(rect.height); 
console.log(rect.getArea()); 

通過這種方法,有些IDE支持自動完成,你可以操縱內部對象的方法,如的ToString等,這是這樣做的,如果你覺得你的需求可能會擴大,不太確定業績基準的最佳實踐但取決於你想採取「最佳實踐」的程度。

1

如果你將options作爲參數傳遞給函數調用,處理這個問題的典型方法是讓函數在可能的情況下爲所有參數設置一組默認值,然後將對象文字傳遞給功能,您希望指定選項。

例如,如果myFunction具有選項colorsizematerial,分配任意數量的缺省值是有意義的(例如,默認colorred,默認sizelarge和默認materialcotton)。然後當你調用myFunction()默認適用,除非你怎麼稱呼它是這樣的:

myFunction({color:'blue', material:'suede'}); 

這裏唯一的默認值保留將大小。

這是jQuery和許多其他庫傾向於做選擇的方式。

0

我會recommendcreate a separate generic .js文件是imported in all pages,集中所有default options。由於reusability也很棒(你不需要在你需要的時候重新配置相同的東西)。

0

這可能是你的情況矯枉過正,但如果你想要你可以創建一個構造函數與getters和setters爲特定的私有變量。這個特定的一個也會在設定之前檢查設定值是否是一個數字。

var Options = function(p1, p2){ 
    var _param1, _param2; 

    this.get_param1 = function(){ 
     return _param1; 
    }; 
    this.get_param2 = function(){ 
     return _param2; 
    }; 

    this.set_param1 = function(v){ 
     if (typeof(v) === 'number') { 
      _param1 = v; 
      return _param1; 
     } else { 
      return false; 
     } 
    }; 
    this.set_param2 = function(v){ 
     if (typeof(v) === 'number') { 
      _param2 = v; 
      return _param2; 
     } else { 
      return false; 
     } 
    }; 

    this.set_param1(p1); 
    this.set_param2(p2); 

    return this; 
}; 

用法是這樣的:

var options = new Options(1, 2); 
options._param1; // => undefined 
options.get_param1(); // => 1 
options.get_param2(); // => 2 
options.set_param1(3); 
options.get_param1(); // => 3 
options.set_param1('fail'); 
options.get_param1(); // => 3 

這是一個非常嚴格的執行,但可能是你在找什麼。

1

那麼有一些方法來定義類。

// serves as a constructor 
function MyClass(name, id) { 
    // init members. 
    // this.members are public members 
    this.Name = name; 
    this.Id = id; 

    // this is a private member available only in constructor 
    var something = 0; 
    this.DoSomething = function() { 
     // your method 
     // here you also can use something here as you have access. 
    } 
} 

MyClass.prototype = { 
    // This also another way to define your methods 
    "SomeMethod": function (input) { 
     // Do something 
     // you don't have access to private members in constructor. 
    } 
} 

而且,如果你想要更多的OOP特性

function AnotherClass (input) { 
    // private field 
    var someNumber = 0; 
    // get accessor 
    this.getSomeNumber = function() { 
     return someNumber; 
    } 
    this.setSomeNumber = function(value) { 
     if (typeof value != "number" || value != value) 
      throw new Error("Your value must be a number"); 
     someNumber = value; 
    } 
} 

如果你想要一些靜態方法,那麼這裏有他們

var MyThirdClass = (function() { 
    var instanceCount = 0; 
    function _Constructor() { 
     this.Name = ""; 
     instanceCount++; 
    } 
    _Constructor.getInstanceCount = function() { 
     return instanceCount; 
    } 
    return _Constructor; 
})(); 

最後,你可以按照如下

使用它們
var myClass = new MyClass("Foo", 1); 
myClass.Name = "Bar"; 
myClass.DoSomething(); 

var thirdClass = new MyThirdClass(); 
var thirdClassAnotherInstance = new MyThirdClass(); 
alert(MyThirdClass.getInstanceCount()); 
相關問題