Лучший метод для объектно-ориентированного программирования Prototype в JavaScript - PullRequest
1 голос
/ 07 мая 2011

Мне скорее нравится прототип способа программирования, и я пытаюсь понять его в javascript.

Я видел этот фрагмент кода в хороших частях:

function beget(o){
  function F(){
    F.prototype = o;
  };
  return new F();
};

Я совсем не понимаю, лол. Если все, что вам нужно сделать, это установить прототип на прошлый объект, то вы не могли бы просто сделать это:

var parent = {
  num = 66;
};
var child = {
  prototype: parent
};

Это, похоже, не работает, потому что child.num возвращается как неопределенное. Как вы описываете программирование прототипов javascript и каковы ваши методы? Спасибо, ребята

Ответы [ 5 ]

2 голосов
/ 07 мая 2011

Лично я думаю, что самый идиоматический метод заключается в следующем:

function Parent() {
    this.value = 2;
}

function Child() {

}

Child.prototype = new Parent();

var c = new Child();
alert(c instanceof Child); // true
alert(c instanceof Parent); // true
alert(c.value); // 2
1 голос
/ 07 мая 2011

Второй пример не работает, потому что вы просто устанавливаете свойство объекта. То, что вы хотите сделать, это установить свойство prototype функции конструктора, а затем создать объект из этой функции.

var parent = {
   num : 666
};

function ChildConstructor(){
   console.log(this.num);
}
ChildConstructor.prototype = parent;

var child = new ChildConstructor();

http://jsfiddle.net/W9C3K/

Установка или изменение прототипа на объекте невозможна без проприетарных методов.

1 голос
/ 07 мая 2011

Вы можете добавить только prototype к функциональному объекту. При вызове через new он будет использовать его в качестве прототипа.

Кстати, указанная вами функция является частью новой версии ECMAScript как Object.create (с дополнительным параметром propertiesObject).

Позвольте мне выразиться так: {object} - это синглтон . A function() object, тем не менее, является конструктором , то есть при вызове с new создает экземпляр (путем выполнения тела функции и использования конструктора прототип). Конечно, прототип также может быть функциональным объектом и иметь собственный прототип и т. Д. Специализация и Обобщение означает переход вверх и вниз по цепочке прототипов.

1 голос
/ 07 мая 2011

Свойство .prototype имеет особое значение для JavaScript, но только для функций, поэтому ваш код не работает.

При «прототипическом наследовании» вы не наследуете от базового класса,Вместо этого вы начинаете с какого-то объекта и создаете новый, используя первый в качестве прототипа.Затем вы добавляете свойства и методы к вновь созданному объекту.

Я не уверен, что вы подразумеваете под "каковы ваши методы?"Вы имеете в виду методологию программирования или что-то в этом роде?

ОБНОВЛЕНИЕ: Ваш вопрос довольно широкий, и я не думаю, что смогу сделать это правильно, если коротко ответить здесь. Возможно, вы захотите взглянуть наниже приведен вопрос SO, в котором подробно обсуждаются прототипы JS, а также есть ссылки на материалы, которые другие люди сочли полезными в этой теме.

Как работает JavaScript .prototype?

0 голосов
/ 07 мая 2011
var parent = {
  num : 66
};
var child = {
   __proto__: parent
};
...