2012-07-10 56 views

回答

5

Hat將是一個構造函數:

function Hat(color, size) { 
    this.id = "X"+color+size; // or anything else 
} 

在原型上是「m編制方法」爲Hat實例:

Hat.prototype.raise = function() { 
    ... 
}; 

但常數是函數對象的屬性:

Hat.Color = { 
    RED: "F00", 
    GREEN: "0F0", 
    ... 
}; 
Hat.Size = { 
    MEDIUM: 0, 
    LARGE: 1, 
    ... 
}; 

如果你的庫實現了‘正確的擴展’功能(沒有什麼特別的構造函數),這也應該工作:

Object.extend(Hat, { 
    Color: {RED: "F00", GREEN: "0F0", ...}, 
    Size: = {MEDIUM: 0, LARGE: 1, ...}, 
}); 
+0

非常有趣('extend')!如果我可能會有一個搭載問題:爲什麼我不能寫'Hat.prototype.Color = {...}'? – BreakPhreak 2012-07-10 07:51:16

+0

這意味着所有的Hat實例都會繼承該Color屬性。您將無法將它們用作構造函數參數。 – Bergi 2012-07-10 07:55:48

+0

btw,你可能是指'jQuery.extend()',對吧? – BreakPhreak 2012-07-10 07:56:59

6

你可以做,如果你創建一個Hat構造函數是這樣的:

function Hat(color, size) { 
    this.color = color; 
    this.size = size; 
} 
Hat.Color = { 
    RED: "#F00", 
    GREEN: "#0F0", 
    BLUE: "#00F" 
}; 
Hat.Size = { 
    SMALL: 0, 
    MEDIUM: 1, 
    LARGE: 2 
} 

然後,您可以創建一個new Hat,並得到其屬性

var hat = new Hat(Hat.Color.RED, Hat.Size.MEDIUM); 
var hatColor = hat.color; // "#F00" 
+0

這是否意味着'Hat.Color'等**必須在聲明'function Hat'後聲明?另外,函數可以通過'var Hat = function(){...};''語句來聲明嗎? – BreakPhreak 2012-07-10 07:37:58

+1

@BreakPhreak你可以使用'function Hat(){}'或者'var Hat = function()'。使用第一個將允許您在聲明'Hat'之前或之後聲明'Hat.Color',因爲'Hat'被掛起。如果你使用第二個,'Hat.Color' **必須在'Hat'之後聲明。 – 2012-07-10 07:40:13

1

這是功能的繼承方式。它區分私有和公共方法和變量。

var Hat = function (color, size) { 
    var that = {}; 
    that.Color = { RED: 'abc'}; // object containing all colors 
    that.Size = { Medium: 'big'}; // object containing all sizes 
    that.print = function() { 
    //I am a public method 
    }; 
    // private methods can be defined here. 
    // public methods can be appended to that. 
    return that; // will return that i.e. all public methods and variables 
} 
+0

...但他想要一個靜態變量。 – Bergi 2012-07-10 08:33:54