Генерация класса из объекта (JavaScript) - PullRequest
0 голосов
/ 07 августа 2009

Я пытаюсь сгенерировать класс из объекта в JavaScript. Например:

var Test = {
    constructor: function() { document.writeln('test 1'); },
    method: function() { document.writeln('test 2'); }
};

var TestImpl = function() { };
TestImpl.prototype.constructor = Test.constructor;
TestImpl.prototype.method = Test.method;

var x = new TestImpl();
x.method();

Но это не работает: он будет писать только «test 2» (по какой-то причине конструктор не определен правильно). Почему?

Ответы [ 4 ]

1 голос
/ 07 августа 2009

Ваша функция TestImpl является конструктором. Обычно вы делаете что-то вроде этого:

var Test1 = function () {
  document.writeln('in constructor');
};

Test1.prototype = {
  x: 3,
  method1: function() { document.writeln('x='+this.x); }
}

var y1 = new Test1();
y1.method1();
y1.x = 37;
y1.method1();

var y2 = new Test1();
y2.method1();
y2.x = 64;
y2.method1();

Я думаю, что у вас есть вещи немного задом наперед. Обычно вы назначаете прототип конструктору, а не назначаете конструктор прототипу.

Причиной назначения метода прототипу конструктора, а не объекту "this" внутри конструктора, является то, что первый метод создает только 1 совместно используемую функцию, тогда как последний создает отдельные экземпляры функции. Это важно (чтобы сохранить разумное количество памяти), если вы создаете много объектов, каждый из которых имеет множество методов.

1 голос
/ 07 августа 2009

Я думаю, вы делаете это неправильно.

Помните, в JavaScript вообще нет классов. Вместо этого у него есть прототипы. Итак, что вы действительно пытаетесь сделать, это создать объект-прототип, который работает как набор функций, созданных вами для другого объекта. Я не могу представить какую-либо полезную цель для этого - не могли бы вы рассказать, что вы пытаетесь сделать?

Хотя я думаю, что вы могли бы заставить его работать, используя что-то вроде:

var TestImpl = function() {
    Test.constructor.apply(this);
};
TestImpl.prototype.method = Test.method;
0 голосов
/ 08 августа 2009

Javascript не имеет концепции «класса», все дело в прототипе и в том, как вы его используете [и вы можете симулировать любое наследование с помощью этой небольшой удобной функции. ] В javascript «Функция» играет роль [Класс, Метод и Конструктор].

поэтому для создания поведения «Класс» в Javascript все, что вам нужно сделать, - это использовать силу «Функции».

var A = function(){
    alert('A.Constructor');
}

A.prototype = {
    method : function(){
        alert('A.Method');
    }
}

var b = new A(); // alert('A.Constructor');
b.method(); // alert('A.Method');

Теперь JS отличается тем, что вы можете легко создать поведение "Наследование", используя тот же метод. Все, что вам нужно сделать, это подключить второй класс "Prototype Chain" к первому, как?

B = function(){
 this.prototype = new A(); // Connect "B"'s protoype to A's
}
B.prototype.newMethod = function() { alert('testing'); }

var b = new B();

b.method();    // Doesn't find it in B's prototype, 
               // goes up the chain to A's prototype

b.newMethod(); // Cool already in B's prototype

// Now when you change A, B's class would automatically change too
A.prototype.method = function(){ alert('bleh'); }
b.method();    // alert('bleh')

Если вам нужны дополнительные ссылки, я предлагаю взглянуть на Сайт Дугласа Крокфорда Happy JS ing.

0 голосов
/ 07 августа 2009
var Test = function () {
  document.writeln('test 1');
  this.method = function() { document.writeln('test 2'); }
};

var x = new Test();
x.method();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...