02.04.2013, 17:50
|
|
Профессор
|
|
Регистрация: 28.02.2011
Сообщений: 349
|
|
Параметры для конструктора в массиве
Нужно вызвать конструктор, причем кол-во параметров заранее не известно, оно находится в массиве. Т.е. нужно сделать что-то типа:
// arr - массив с параметрами.
var x;
switch( arr.length ) {
case 0: x = new MyConstructor(); break;
case 1: x = new MyConstructor( arr[0] ); break;
case 2: x = new MyConstructor( arr[0], arr[1] ); break;
case 3: x = new MyConstructor( arr[0], arr[1], arr[2] ); break;
}
apply в этом случае не помогает, нужно вызвать именно через new
Можно было бы сделать так:
var x = Object.create( MyConstructor.prototype );
MyConstructor.apply( x, arr );
но хочется сохранить совместимость с версией языка, где Object.create отсутствует. Кто-нибудь может что-нибудь подсказать?
|
|
02.04.2013, 18:54
|
|
Профессор
|
|
Регистрация: 11.09.2010
Сообщений: 8,804
|
|
Сообщение от rgl
|
где Object.create отсутствует
|
Так есть же es5-shim.js
|
|
02.04.2013, 19:38
|
|
Профессор
|
|
Регистрация: 28.02.2011
Сообщений: 349
|
|
Честно говоря, задал вопрос для очистки совести, сильно не надеялся, однако же...
var x = (function(p){
function T(){}
T.prototype=p;
return new T();
})( MyConstructor.prototype );
MyConstructor.apply( d, arr );
спасибо
|
|
02.04.2013, 19:53
|
|
|
Регистрация: 10.07.2008
Сообщений: 3,873
|
|
|
|
03.04.2013, 01:46
|
|
junior
|
|
Регистрация: 29.11.2011
Сообщений: 3,924
|
|
Сообщение от rgl
|
Нужно вызвать конструктор
|
Сообщение от rgl
|
apply в этом случае не помогает
|
Сообщение от rgl
|
Можно было бы сделать так
|
Сообщение от rgl
|
MyConstructor.apply( x, arr );
|
где логика?
0.
var x = new MyConstructor([ 1, 2, 3]);
1.
MyConstructor.apply( null, arr );
function MyConstructor() {
if (!(this instanceof MyConstructor)) {
return new MyConstructor( arguments );
}
}
2.
var x = new MyConstructor({
лепи: че_хочешь
});
Наверно, массив-параметров или объект с параметрами передают не случайно, чтобы не городить такого
Сообщение от rgl
|
case 0: x = new MyConstructor(); break;
5
case 1: x = new MyConstructor( arr[0] ); break;
6
case 2: x = new MyConstructor( arr[0], arr[1] ); break;
7
case 3: x = new MyConstructor( arr[0], arr[1], arr[2] ); break;
|
__________________
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук
Последний раз редактировалось nerv_, 03.04.2013 в 01:55.
|
|
03.04.2013, 01:57
|
|
Профессор
|
|
Регистрация: 18.01.2013
Сообщений: 1,098
|
|
function Cat (name){
this.name = name;
}
Cat.create = function(args){
var _ = function(){};
_.prototype = this.prototype;
var inst = new _;
this.apply(inst,args);
return inst;
};
var cat = Cat.create(['Ашот']);
alert(cat.name);
а еще это можно использовать вот так вот
function Cat(name, age) {
if (this instanceof Cat === false) { // опа на
return Cat.create(arguments);
}
this.name = name;
this.age = age;
}
Function.prototype.create = function(args){
var _ = function(){};
_.prototype = this.prototype;
var inst = new _;
this.apply(inst,args);
return inst;
};
var cat = new Cat('Ашот',11);
var cat2 = Cat('Ашот',11); // и можно вызывать без new
Последний раз редактировалось megaupload, 03.04.2013 в 02:08.
|
|
03.04.2013, 02:03
|
|
Профессор
|
|
Регистрация: 18.01.2013
Сообщений: 1,098
|
|
Сообщение от nerv_
|
if (!(this instanceof MyConstructor)) {
|
какой ужасный код, приоритеты операторов не, не слышал?
|
|
03.04.2013, 14:43
|
|
Профессор
|
|
Регистрация: 28.02.2011
Сообщений: 349
|
|
nerv_,
Все это хорошо и правильно, но вопрос был другой, не как написать правильный конструктор, а как вызвать имеющийся.
megaupload,
Приоритет instanceof ниже чем приоритер воскл.знака, значит скобки тут необходимы. А вот писать if( булевскоезначение === false ) действительно ужасно.
|
|
03.04.2013, 19:43
|
Профессор
|
|
Регистрация: 07.11.2010
Сообщений: 301
|
|
В кофескрипте написал это:
newMyConstructor = (arr...)->new MyConstructor arr...
а получил вот это:
var newMyConstructor,
__slice = [].slice;
newMyConstructor = function() {
var arr;
arr = 1 <= arguments.length ? __slice.call(arguments, 0) : [];
return (function(func, args, ctor) {
ctor.prototype = func.prototype;
var child = new ctor, result = func.apply(child, args);
return Object(result) === result ? result : child;
})(MyConstructor, arr, function(){});
};
И походу должно работать.
|
|
04.04.2013, 11:20
|
|
Профессор
|
|
Регистрация: 18.01.2013
Сообщений: 1,098
|
|
Сообщение от rgl
|
Приоритет instanceof ниже чем приоритер воскл.знака, значит скобки тут необходимы.
|
ты вообще понял что я написал?
Сообщение от rgl
|
А вот писать if( булевскоезначение === false ) действительно ужасно.
|
ты просто еще новичок в программировании и многого не знаешь, если тебе не нужна моя помощь то прошу пройти нахуй и не создавать треды) если нужна, то слушай что дяди говорят.
Последний раз редактировалось megaupload, 04.04.2013 в 11:24.
|
|
|
|