JavaScript-конструкторы, использующие условное обозначение объекта JavaScript

Каков наилучший способ создания конструкторов в JavaScript с использованием объектной литературной нотации?

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

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

Я хочу, чтобы иметь возможность звонить

var myVar = new myObject(...);

И передать аргументы функции-конструктора внутри myObject.

Ответы

Ответ 1

Это not "JSON notation", это текстовая буква 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:

Если вам нужно создать экземпляр многих объектов одного и того же типа, используйте конструктор + прототип. Если вам нужен только один объект (например, singleton), тогда нет необходимости использовать функцию конструктора (большую часть времени). Вы можете напрямую использовать объектную нотацию для создания этого объекта.

Ответ 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'});

Ответ 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 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

Это глупые примеры, но есть ли причина не делать этого или почему это недействительно? Он избавляется от глобальной проблемы переполнения, которую люди обычно хотят использовать объектной литературой для библиотек.

Ответ 4

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

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

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

//...

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

Ответ 5

Самый простой способ, который я знаю:

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

Ответ 6

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

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

вы не можете создать новый объект выше этого пути

var myVar = new myObject(...);

но вы можете добиться того же, что и ниже,

var myVar = Object.create(myObject );