2010-12-30 3 views
0

Вместо использования метода вызова, было бы применимо использовать следующие, например:Прототип Конструктор Вызов

var A = function(height,weight) { 
    this.height = height; 
    this.weight = weight; 
}; 

var a = new A("6ft","500lbs"); 

A.prototype.foo = { 
    setup: function() { 
     this.height.set(); 
     this.weight(); 
    }, 

    height: { 
     set: function() { 
      var constr = a; 
      var self = this; 

      console.log(constr); 
      console.log(self); 
     } 
    }, 

    weight: function() { 
     var constr = a; 
     var self = this; 

     (function() { 
      console.log(constr); 
     })(); 
    } 
}; 

a.foo.setup(); 

Любые предложения приветствуются.

Приветствия

+1

Что вы пытаетесь достичь? –

+0

Возможность наследования свойств от конструктора, когда мне это нужно, без использования метода call/apply. – domscripter

ответ

1

Вы можете сделать это, но то, что беспорядок. height и weight имеют два разных значения; все экземпляры A будут возвращаться к этому начальному a. Что вы пытаетесь достичь?

Edit:

Проблема с использованием прототипов заключается в том, когда он будет создан, нет никакого функционального контекста относится к конкретному примеру (по той очевидной причине, что прототип создается только один раз, как правило, до того, . экземпляр класса без контекста, там нет места, чтобы спрятать переменные частную к примеру, что я предпочитаю, чтобы создать методы в строительстве:.

var A = function(height, weight) { 
    this.height = function() { return height; }; 
    this.weight = function() { return weight; }; 
}; 

Используйте функцию, чтобы создать сам прототип создает общий (частное , статический) контекст для все экземпляров. Вы даже можете смешивать понятие:

var A = function(height, weight) { 
    this.__init__(height, weight); 
}; 

A.prototype.__init__ = (function() { 
    // any variables declared here are private and static 
    var number_of_instances = 0; 
    return function(height, weight) { 
     // any variables declared here are private and NOT static 

     // as always, anything added to this are public and not static 
     this.getNumberOfInstances = function() { 
      return number_of_instances; 
     }; 

     this.height = function() { return height; }; 
     this.weight = function() { return weight; }; 
     number_of_instances++; 
    }; 
})(); 

Я не в восторге от перезаписывания всего прототипа, это означает, что вы не можете изменить, чтобы наследовать от другого класса.

+0

Я пытаюсь получить возможность вызвать свойства конструктора, когда мне это нужно. Кроме того, я хочу, чтобы у вас были общедоступные/частные области. Вышеупомянутый кодовый блок является более стресс-тестом. – domscripter

+0

Спасибо, ваш пример работает красиво! У меня осталось два вопроса: http://pastie.org/1418410 - В отношении мест размещения var a = new A(); где предпочтительное размещение, например: прямо после функции конструктора или ниже в файле? Кроме того, из примеров в пасте, какой из них лучше из кучи? – domscripter

+0

В общем, класс, определяющий код, хранится с кодом, определяющим связанные классы, чтобы сформировать логический модуль или библиотеку. Вызывается конструктор - то есть экземпляр экземпляра создается везде, где это необходимо, что часто бывает довольно далеко, обычно в разных файлах. Примеры в пасте - все это странно, по-разному. Я думаю, вы должны сначала разработать хороший опрятный API, а затем написать код для его соответствия. BTW, немного этикета StackOverflow: если вам нравится мой ответ, запустите его или повысьте. – Malvolio

Смежные вопросы