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

Это должно сработать:

MatchResult findNthOccurance(int n, Pattern p, CharSequence src){
    Matcher m = p.matcher(src);
    for(int i = 0; i<n; i++) m.find();
    return m;
}

По сути, он просто вызывает find несколько раз на Matcher, полученном из Pattern. Удобно, что Matcher также является MatchResult, поэтому я могу просто вернуть его прямо вверх.

11
задан Jason Bunting 2 May 2009 в 02:18
поделиться

5 ответов

Try this:

var instance = {};
MyClass.apply( instance, r);

All the keyword "new" does is pass in a new object to the constructor which then becomes the this variable inside the constructor function.

Depending upon how the constructor was written, you may have to do this:

var instance = {};
var returned = MyClass.apply( instance, args);
if( returned != null) {
    instance = returned;
}

Update: A comment says this doesn't work if there is a prototype. Try this.

function newApply(class, args) {
    function F() {
        return class.apply(this, args);
    }
    F.prototype = class.prototype;
    return new F();
}

newApply( MyClass, args);
15
ответ дан 3 December 2019 в 06:47
поделиться

One possibility is to make the constructor work as a normal function call.

function MyClass(arg1, arg2) {
    if (!(this instanceof MyClass)) {
        return new MyClass(arg1, arg2);
    }

    // normal constructor here
}

The condition on the if statement will be true if you call MyClass as a normal function (including with call/apply as long as the this argument is not a MyClass object).

Now all of these are equivalent:

new MyClass(arg1, arg2);
MyClass(arg1, arg2);
MyClass.call(null, arg1, arg2);
MyClass.apply(null, [arg1, arg2]);
0
ответ дан 3 December 2019 в 06:47
поделиться

what about a workaround?

function MyClass(arg1, arg2) {

    this.init = function(arg1, arg2){
        //if(arg1 and arg2 not null) do stuff with args
    }

    init(arg1, arg2);
}

So how you can:

var obj = new MyClass();
obj.apply(obj, args);
0
ответ дан 3 December 2019 в 06:47
поделиться

Кодовая база проекта Continuum не слишком велика. Попробуйте создать новый проект в Visual C # Express и импортировать код вручную. Возможно, вам придется добавить некоторые ссылки, прежде чем вы сможете успешно строить.

Редактировать:

Я только что сделал это с проектом Continuum.

Вот мой процесс:

  • Скачать и извлечь Continuum-1.1 .1-Source.zip
  • Удалить Continuum.sln и Continuum.csproj
  • Создать новый проект Windows Forms в Visual C # Express под названием Continuum
  • Удалить стандартные файлы Form1.cs и Program.cs и все файлы в папке «Свойства»
  • Сохраните новый проект и решение в ранее извлеченной папке «Continuum»
  • Включите «Показать все файлы» в обозревателе решений
  • Включите все файлы и папки, кроме «bin», папки "obj" и "CompliedBinary"
    • Не забудьте включить все файлы в папку «Свойства»
  • Добавить ссылку на ZedGraph.dll (находится в папке «zedgraph_dll_v5.1.5»)
  • Построить и наслаждаться

Далее Редактировать :

Вот разница в Unix неотредактированных файлов sln и csproj Continuum по сравнению с теми, которые я создаю, используя процесс, упомянутый выше. (Я объединил файл вручную, чтобы выявить реальные различия.) (Игнорировать подсветку синтаксиса.)

Continuum_original.csproj против Continuum_new.csproj

6c6
    <ProductVersion>9.0.21022</ProductVersion>
---
    <ProductVersion>9.0.30729</ProductVersion>
8c8
    <ProjectGuid>{FD0F9C26-38BF-473F-8FD4-FDB1C7BEA600}</ProjectGuid>
---
    <ProjectGuid>{E3E4FFA5-0EC3-4F94-B842-33C7A49B7FF5}</ProjectGuid>
13c13
    <TargetFrameworkVersion>v2.0</TargetFrameworkVersion>
---
    <TargetFrameworkVersion>v3.5</TargetFrameworkVersion>
37a38,46
    <Reference Include="System.Core">
      <RequiredTargetFramework>3.5</RequiredTargetFramework>
    </Reference>
    <Reference Include="System.Xml.Linq">
      <RequiredTargetFramework>3.5</RequiredTargetFramework>
    </Reference>
    <Reference Include="System.Data.DataSetExtensions">
      <RequiredTargetFramework>3.5</RequiredTargetFramework>
    </Reference>
225c234
  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
---
  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />

Continuum_original.sln против Continuum_new.sln

3,4c3,4
# Visual Studio 2008
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Continuum", "Continuum.csproj", "{FD0F9C26-38BF-473F-8FD4-FDB1C7BEA600}"
---
# Visual C# Express 2008
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Continuum", "Continuum.csproj", "{E3E4FFA5-0EC3-4F94-B842-33C7A49B7FF5}"
12,15c12,15
        {FD0F9C26-38BF-473F-8FD4-FDB1C7BEA600}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
        {FD0F9C26-38BF-473F-8FD4-FDB1C7BEA600}.Debug|Any CPU.Build.0 = Debug|Any CPU
        {FD0F9C26-38BF-473F-8FD4-FDB1C7BEA600}.Release|Any CPU.ActiveCfg = Release|Any CPU
        {FD0F9C26-38BF-473F-8FD4-FDB1C7BEA600}.Release|Any CPU.Build.0 = Release|Any CPU
---
        {E3E4FFA5-0EC3-4F94-B842-33C7A49B7FF5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
        {E3E4FFA5-0EC3-4F94-B842-33C7A49B7FF5}.Debug|Any CPU.Build.0 = Debug|Any CPU
        {E3E4FFA5-0EC3-4F94-B842-33C7A49B7FF5}.Release|Any CPU.ActiveCfg = Release|Any CPU
        {E3E4FFA5-0EC3-4F94-B842-33C7A49B7FF5}.Release|Any CPU.Build.0 = Release|Any CPU

Вы заметите что файлы существенно не отличаются и, как отмечено в комментариях к этому ответу, я могу фактически открыть, скомпилировать и запустить неотредактированный проект Continuum 1.1.1! Похоже, проблема может быть в вопросе 9.0.30729.1 SP Microsoft .NET Framework версии 3.5 SP1

Установленное издание: C # Express

Microsoft Visual C # 2008
91910-152-0000061-60588 Microsoft Visual C # 2008

Исправление для Microsoft Visual C # 2008 Экспресс-выпуск с SP1 - ENU (KB945282) KB945282 Для более информация, визит http://support.microsoft.com/kb/945282 .

Исправление для Microsoft Visual C # 2008 Экспресс-выпуск с SP1 - ENU (KB946040) KB946040 Для более информация, визит http://support.microsoft.com/kb/946040 .

Исправление для Microsoft Visual C # 2008 Экспресс-выпуск с SP1 - ENU (KB946308) KB946308 Для более информация, визит http://support.microsoft.com/kb/946308 .

Исправление для Microsoft Visual C # 2008 Экспресс-выпуск с SP1 - ENU (KB947540) KB947540 Для более информация, визит http://support.microsoft.com/kb/947540 .

Исправление для Microsoft Visual C # 2008 Экспресс-выпуск с SP1 - ENU (KB947789) KB947789 Для более информация, визит http://support.microsoft.com/kb/947789 .

Название ОС Microsoft Windows Vista Версия 6.0.6001 Сервис Еще одна вещь, на которую следует обратить внимание - попробуйте создать экземпляры одного и того же типа с помощью этих различных методов, а затем проверить, совпадают ли их свойства конструктора, - вы можете захотеть, чтобы это было так, если вам когда-либо понадобится проверить тип объекта. То, что я имею в виду, лучше всего иллюстрируется следующим кодом:

function Person(firstName, lastName) {
   this.FirstName = firstName;
   this.LastName = lastName;
}

var p1 = new Person("John", "Doe");
var p2 = Person.build(["Sara", "Lee"]);

var areSameType = (p1.constructor == p2.constructor);

Попробуйте это с некоторыми другими взломами и посмотрите, что произойдет. В идеале вы хотите, чтобы они были одного типа.


CAVEAT: как отмечено в комментариях, это не будет работать для тех функций конструктора, которые созданы с использованием синтаксиса анонимных функций, то есть

MyNamespace.SomeClass = function() { /*...*/ };

Если вы не создадите их как это:

MyNamespace.SomeClass = function SomeClass() { /*...*/ };

Решение, которое я предоставил выше, может или не может быть полезным для вас, вам нужно точно понимать, что вы делаете, чтобы найти лучшее решение для ваших конкретных потребностей, и вы должны быть в курсе происходящего сделать мое решение

1
ответ дан 3 December 2019 в 06:47
поделиться

Обратите внимание, что

  •  новый myClass ()
    

    без аргументов может завершиться ошибкой, поскольку функция-конструктор может полагаться на существование аргументов.

  •  myClass.apply (something, args)
    

    не работает во многих случаях, особенно если вызывается в собственных классах, таких как Date или Number.

Я знаю, что "eval - это зло", но в этом случае вы можете попробовать следующее:

function newApply(Cls, args) {
    var argsWrapper = [];
    for (var i = 0; i < args.length; i++) {
        argsWrapper.push('args[' + i + ']');
    }
    eval('var inst = new Cls(' + argsWrapper.join(',') + ');' );
    return inst;
}

Все просто .

(Работает так же, как Instance.New в этом сообщении в блоге )

2
ответ дан 3 December 2019 в 06:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: