2012-07-10 62 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