Javascript &引用;“类”;常量和构造函数:如何实现?

Javascript &引用;“类”;常量和构造函数:如何实现?,javascript,Javascript,我希望在javasript中实现类似的功能,请: var hat = new Hat(Hat.Color.RED, Hat.Size.MEDIUM); 我该怎么做呢(试图搞乱函数prototype,但有一点成功)?如果您创建一个Hat构造函数,您可以这样做: function Hat(color, size) { this.color = color; this.size = size; } Hat.Color = { RED: "#F00", GREEN: "#0F0",

我希望在javasript中实现类似的功能,请:

var hat = new Hat(Hat.Color.RED, Hat.Size.MEDIUM);

我该怎么做呢(试图搞乱函数
prototype
,但有一点成功)?

如果您创建一个
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
}
然后,您可以创建一个
新帽子
,并获取其属性

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

如果您创建一个如下的
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
}
然后,您可以创建一个
新帽子
,并获取其属性

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

Hat
将是一个构造函数:

function Hat(color, size) {
    this.id = "X"+color+size; // or anything else
}
原型上有
Hat
实例的“方法”:

Hat.prototype.raise = function() {
    ...
};
但常数是函数对象的属性:

Hat.Color = {
    RED: "F00",
    GREEN: "0F0",
    ...
};
Hat.Size = {
    MEDIUM: 0,
    LARGE: 1,
    ...
};
如果您的库正确地实现了“extend”函数(构造函数没有什么特别之处),这也应该起作用:

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

Hat
将是一个构造函数:

function Hat(color, size) {
    this.id = "X"+color+size; // or anything else
}
原型上有
Hat
实例的“方法”:

Hat.prototype.raise = function() {
    ...
};
但常数是函数对象的属性:

Hat.Color = {
    RED: "F00",
    GREEN: "0F0",
    ...
};
Hat.Size = {
    MEDIUM: 0,
    LARGE: 1,
    ...
};
如果您的库正确地实现了“extend”函数(构造函数没有什么特别之处),这也应该起作用:

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

这是函数继承方式。它区分私有和公共LCI方法和变量

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
}

这是函数继承方式。它区分私有和公共LCI方法和变量

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
}

这是否意味着在声明
函数Hat
之后必须声明
Hat.Color
等?此外,可以通过
var Hat=function(){…}声明函数
syntax?@BreakPhreak您可以使用
function Hat(){}
,或者
var Hat=function()
。使用第一个将允许您在声明
Hat
之前或之后声明
Hat.Color
,因为
Hat
已提升。如果使用第二个,
Hat.Color
必须在
Hat
之后声明。这是否意味着
Hat.Color
等必须在声明
函数Hat
之后声明?此外,可以通过
var Hat=function(){…}声明函数
syntax?@BreakPhreak您可以使用
function Hat(){}
,或者
var Hat=function()
。使用第一个将允许您在声明
Hat
之前或之后声明
Hat.Color
,因为
Hat
已提升。如果使用第二个,
Hat.Color
必须在
Hat
之后声明。非常有趣(
extend
)!如果可以的话,一个附带的问题是:为什么我不能编写
Hat.prototype.Color={…}
?这意味着所有Hat实例都将继承该Color属性。您将无法将它们用作构造函数参数。jQuery.extend就是一个例子,有很多js库具有extend函数。我只想编辑答案,因为
Object.extend
只是
未定义的
@BreakPhreak:不,Benjamin是对的(例如,我的lib将其作为
对象
上的静态属性来实现)。顺便说一句,jQuery会很高兴地忘记复制的属性已被冻结;您需要…
.extend(Hat,{Color:Object.freeze({…}),Size:Object.freeze({…});
非常有趣(
extend
)!一个背驮式问题:为什么我不能写
Hat.prototype.Color={…}
?这意味着所有Hat实例都将继承该Color属性。您将无法将它们用作构造函数参数。jQuery.extend就是一个例子,有很多带有extend函数的js库。我只想编辑答案,因为
Object.extend
只是
未定义的
@BreakPhreak:No,Benj阿明是对的(例如,我的lib将它作为
对象
上的静态属性来实现)。顺便说一句,jQuery会很高兴地忘记复制的属性被冻结了;你想要…
.extend(Hat,{Color:Object.freeze({…}),Size:Object.freeze({…});
,但是他想要一个静态变量……但是他想要一个静态变量。