JavaScript构造函数使用JavaScript对象文字表示法

时间:2011-03-03 10:11:28

标签: javascript json

使用对象文字表示法在JavaScript中构建构造函数的最佳方法是什么?

var myObject = {
 funca : function() {
  //...
 },

 funcb : function() {
  //...
 }
};

我希望能够致电

var myVar = new myObject(...);

并将参数传递给myObject中的构造函数。

6 个答案:

答案 0 :(得分:46)

这是“JSON表示法”,这是JavaScript 对象文字符号。 JSON只是JS对象文字表示法的一个子集,但除了看起来相似之外,它们没有任何共同之处。 JSON用作数据交换格式,如XML。

你不想做什么。

var myObject = {};

创建一个对象。没有什么可以实例化的。

但是,您可以创建构造函数并将方法添加到其原型中:

function MyObject(arg1, arg2) {
    // this refers to the new instance
    this.arg1 = arg1;
    this.arg2 = arg2;

    // you can also call methods
    this.funca(arg1);
}

MyObject.prototype = {
 funca : function() {
  // can access `this.arg1`, `this.arg2`
 },

 funcb : function() {
  // can access `this.arg1`, `this.arg2`
 }
};

使用new MyObject()实例化的每个对象都将继承原型的属性(实际上,实例只是获取对原型对象的引用)。

有关JavaScript对象和继承的更多信息:


<强> UPDATE2:

如果必须实例化许多相同类型的对象,则使用构造函数+ prototype。如果您只需要一个对象(如单例),则无需使用构造函数(大多数情况下)。您可以直接使用对象文字表示法来创建该对象。

答案 1 :(得分:7)

使对象成为一个函数,如下所示:

var myObject = function(arg1){
  this.funca = function(){
    //...
  };
  this.funcb = function(){
    //...
  };
  this.constructor = function(obj){
    alert('constructor! I can now use the arg: ' + obj.name);
  };
  this.constructor(arg1);
};

// Use the object, passing in an initializer:
var myVar = new myObject({ name: 'Doug'});

答案 2 :(得分:3)

很抱歉迟到了,但是...我认为这个是不可能的是有点限制性的,这取决于你如何解释OP的问题和随后的评论。

假设OP需要命名空间的好处,那么对象文字符号可以带给库,但也希望在该结构中使用一些“类”。你能否使用这种形式的东西将构造函数模式组合成对象文字符号命名空间的库结构?

var myNamespace = {
    aProperty: "A value",

    aMethod: function () { return "A method result"; },

    onePlusOneEquals: function () {
        return new myNamespace.classes.NumberStuff(1, 1).added;
    },

    classes: {
        ClassA: function () {
            this.propertyOne = null;
            this.methodOne = function (param) {
                return "The method was passed " + param;
            }
        },

        NumberStuff: function (argOne, argTwo) {
            this.added      = argOne + argTwo;
            this.subtracted = argOne - argTwo;
        }
    }
};

myNamespace.classes.ClassA.prototype.methodTwo = function () { return "At least this one's not bloating our memory footprint with every ClassA created..."; };

...

var anObj = new myNamespace.classes.ClassA();
alert(anObj.methodOne("the parcel")); // "The method was passed the parcel"
alert(myNamespace.onePlusOneEquals()); //2

他们是愚蠢的例子,但有没有理由不这样做,或者为什么这是无效的?它消除了人们通常希望对库使用对象文字符号的全局拥挤问题。

答案 3 :(得分:3)

var myObject = function(arg){
    return{
        constructor: function(arg){
            //...
            return this;
        },

        funca: function(){
            //...
        },

        funcb: function(){
            //...
        }
    }.constructor(arg);
};

//...

var myVar = new myObject("...");

答案 4 :(得分:2)

我所知道的最简单的方法是:

function test(arg1, arg2) {
  var1 = arg1;
  var2 = arg2;
  return {
    var3 : var1, // json can access var1
    var4 : var2 // json can access var2
  };
}

arg1 = 'test';
arg2 = function() {
  window.alert('test')
};
var5 = new test(arg1, arg2);
var5.var4();

答案 5 :(得分:2)

var myObject = {
 funca : function() {
  //...
 },

 funcb : function() {
  //...
 }
};

你无法以这种方式创建一个新对象

var myVar = new myObject(...);

但你可以用下面的构造实现相同的,

var myVar = Object.create(myObject );