使用JavaScript对象文字符号的JavaScript构造函数

使用JavaScript对象文字符号的JavaScript构造函数,javascript,json,Javascript,Json,使用对象文字符号在JavaScript中构建构造函数的最佳方法是什么 var myObject = { funca : function() { //... }, funcb : function() { //... } }; 我想打个电话 var myVar = new myObject(...); 并将参数传递给myObject中的构造函数。这是而不是“JSON符号”,这是JavaScript对象文字符号。JSON只是JS对象文字符号的一个子集,但除了看起来相似之外,它

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

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

 funcb : function() {
  //...
 }
};
我想打个电话

var myVar = new myObject(...);

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

这是而不是“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对象和继承的更多信息:


更新2:


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

将对象设置为函数,如下所示:

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'});

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

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();

抱歉来晚了,但是。。。我认为说这不可能是有点限制性的,这取决于你如何解释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
这些都是愚蠢的例子,但有什么理由不这样做,或者为什么这是无效的?它消除了人们通常希望在库中使用对象文字表示法的全局拥挤问题

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

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

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

//...

var myVar = new myObject("...");
您不能以这种方式创建上述的新对象

var myVar = new myObject(...);
但是你可以通过下面的构造来实现同样的效果

var myVar = Object.create(myObject );


您没有传递JSON。您正在传递一个JavaScript对象。JSON规范旨在与JavaScript对象互换。您知道JSON是JavaScript对象表示法的首字母缩略词吗?Wiki的第一段很好地总结了这一点:这并没有改变
JSON!==JavaScript对象
。JSON不是JavaScript,JavaScript也不是JSON。您可以在比JavaScript多得多的环境中使用JSON。JavaScript对象只是JavaScript中JSON的表示形式。在Java或Python中,它将是Java或Python对象。JSON是一种完全独立于语言的文本格式(…)。在您的示例中,
{name:'Doug'}
是(a)非文本,并且(b)甚至不符合JSON语法。如果您传递字符串
“{”name:“Doug”}”
,它将是JSON。我可以添加一个eval,您就可以得到它了。但好吧,我改变了答案,排除了JSON派生的对象。然而,我认为我的答案正好是他想要的(在你编辑你的答案以包含与我相同的构造函数逻辑之前)。JSON不是主要问题(当前编辑的问题甚至不包括这个词)。我没有说你的答案是错误的。但重要的是要使用正确的术语,让人们意识到JSON不是JavaScript对象文字语法。使用通用(正确)术语是沟通的关键。任何其他的东西都会造成混乱和误解…+1,但也许可以写一个小例子来说明OP是一个很好的使用模式。。。我已经编辑了我的帖子,用objectliteral代替JSON。谢谢。Re:Update,请参阅我在我的OP上的评论,这不是关于返回对象,而是寻找定义对象结构的最佳方法。Re:Update2。。。这正是我要找的。两者都是最好的。谢谢。你不应该直接覆盖原型。可以这样添加:MyObject.prototype.funca=function(){//do stuff};MyObject.prototype.funcb=function(){//do stuff};你到底想实现什么?我正在寻找用JavaScript定义类结构的最佳方法。我知道你可以通过原型设计来实现,但是环顾网络,我发现越来越多的javascript库使用对象文字(而不是JSON;)表示法,而不是原型设计。。。为什么会这样?你能举个具体的例子吗?如果一个人只需要一个对象,那么就不需要有构造函数。@Felix我在寻找一个更一般的情况。。。我正在构建一个javascript库,并正在寻找实现类结构的最佳方法。同一脚本中可以出现同一对象的多个实例。所以我的最终结果是。。。。var o=新的myObject(someArgs)。。。o、 doSomething(someArg)。。。o、 doSomethingElse(someArg);。。。我可以使用原型来实现这一点,但是最近看到上面的符号越来越多地被使用,所以我想知道这是否是一种更好的方法,没有其他方法。使用原型是最有效的方法。您所看到的可能是一些特殊情况,其中必须满足其他要求。但如果不了解他们,就很难说出其他人做了什么……很好的例子,我实际上有一个类似的问题,但它也涉及到遗产。你知道怎么解决吗?谢谢。我刚刚看了一眼,很高兴看到你的问题似乎已经得到了回答。
var myVar = Object.create(myObject );