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