2009-03-26 2 views
1

во многих книгах и онлайн учебник есть примеры по передаче данных в конструктор супер-класса с помощью шаблона метода заимствования:costructors заимствования и цепи прототипов

var Parent = function(name) 
{ 
    this.name = name; 
    this.my_parent = "parent_property"; 
    this.go = function() 
    { 
     alert("GO") 
    } 

} 

var Child = function(name) 
{ 
    this.name = name; 
    this.my_child = "child_property"; 

    Parent.call(this); 

    alert(this.hasOwnProperty("go")) // HERE TRUE!!! 
} 

var ChildChild = function(name) 
{ 
    this.name = name; 
    this.su = function(){} 
} 

// PSEUDO CLASSICAL ECMA STANDARD 
Child.prototype = new Parent("PARENT"); 
ChildChild.prototype = new Child("CHILD"); 
var c = new ChildChild("CHILDCHILD"); 

теперь мой вопрос: правильно ли это? в этом шаблоне свойства суперкласса копируются в ЭТО, но в системе ООП, я думаю, что эти свойства должны быть в своем суперклассе . Теперь конструктор BORROWING - это еще один шаблон, который делает вид наследования таким образом, что я не могу использовать прототип, и поэтому все свойства суперкласса цепочки - это в последний дочерний класс ... но я не думаю, что он эффективен.

Итак, в конце, как я могу передавать данные в суперкласс без этого шаблона?

Благодаря

ответ

1

Позвонив .call() вы не наследуете в классическом смысле этого слова, а не вы говорите ребенку применить Родитель прототип на себя и, таким образом, Child.prototype клонировал свойство и методы от Родителя. Это не имеет проблем с производительностью, несмотря на то, что отказ от прототипа по соображениям эффективности не является веской причиной.

Если я могу быть честным, я думаю, что применение парадигм OO на javascript - самая большая ошибка, которую может сделать разработчик javascript. Подобно тому, как нужно учиться справляться с неизменностью в функциональном программировании, пытаясь заставить javascript вести себя как классический OO, будет работать только против вас в долгосрочной перспективе.

Это не ответит на ваш вопрос, но есть много разных способов применения a super functionality to javascript, ни один из которых я не могу порекомендовать, хотя нет окончательной версии, которая не имеет нисходящего пути вниз по линии.

+0

Вы писали: «» Ребенок применить Родитель прототип на себя и, таким образом, Child.prototype клонировал свойство и методы из Родитель «» .call или .На просто использовать функцию другого объекта, переходящее в этом объекте ссылающегося поэтому я не понимаю, как прототип может работать так, как вы сказали. – xdevel2000

1

JavaScript не имеет неотъемлемой поддержки для создания иерархии наследования. Путь JavaScript делать расширения типа можно было бы добавить свойства от «родительского класса» к «классу ребенка», т.е.

function Parent(foo) { 
    this.foo = foo; 
} 

Parent.prototype.sharedFoo = 'sharedFoo'; 

function Child(foo, bar) { 
    // call the parent constructor 
    Parent.call(this, foo); 
    this.bar = bar; 
} 

Child.prototype.sharedBar = 'sharedBar'; 

// copy the properties of the parent class 
for(var prop in Parent.prototype) { 
    if(Parent.prototype.hasOwnProperty(prop)) 
     Child.prototype[prop] = Parent.prototype[prop]; 
} 

Это также легко можно добавить истинный прототип наследства, например like this.

посредством использования функции clone(), теперь можно позволить прототип объекта из «класса ребенка наследуют от объекта-прототипа из" базового класса:

function Parent(foo) { 
    this.foo = foo; 
} 

Parent.prototype.sharedFoo = 'sharedFoo'; 

function Child(foo, bar) { 
    // call the parent constructor 
    Parent.call(this, foo); 
    this.bar = bar; 
} 

// inherit from the parent class 
Child.prototype = clone(Parent.prototype); 

Child.prototype.sharedBar = 'sharedBar'; 
+0

в JS вы можете делать наследование по-разному ... что вы написали одно на многих ... для ECMA наследование должно выполняться через прототип (псевдоклассический), и я не согласен с вашим утверждением «JavaScript не имеет неотъемлемой поддержки для создания иерархии наследования ». Я думаю, что это так, как говорит ECMA. – xdevel2000

+0

@ xdevel2000: JS не имеет неотъемлемой поддержки для иерархиев (внутреннее значение синтаксическое или со встроенными объектами); если вы этого хотите, вы должны сами предоставить его (см. функцию clone() или наследование на основе классов: http://mercurial.intuxication.org/hg/js-hacks-docs/raw-file/tip/class-en .html) – Christoph

+0

@ xdevel2000: «JavaScript-путь» расширения - это агрегация, а не наследование, но, как я уже сказал, язык достаточно мощный, чтобы поддерживать другие парадигмы, но это не значит, что он был предназначен для их размещения – Christoph

1

JavaScript является прототип на основе, Функциональный язык, который претендует на роль двоюродного брата Java.

Вот несколько ключевых моментов, о JavasSript:

  • все является объектом, в том числе функции
  • объект больше похож Hash, он представляет собой набор пар ключ-значение
  • сам прототип Object а также

Чтобы ответить на ваш первый вопрос о выполнении «заимствование» прототип:

Как правило, класс JavaScript содержит коллекцию [имя, объект функции] пар. Когда вы заимствуете прототип родительского класса , вы в основном копируете значения исходного объекта-прототипа в прототип объекта дочернего класса.

Копия ссылка, когда функция копируется, код функции не дублируется, копируется только ссылка. Это похоже на указатели на языке C.

Таким образом, единственное падение производительности является дублирования объекта-прототипа, который занимает очень мало памяти.

Чтобы ответить на ваш второй вопрос о том, как передать данные в родительский класс в чистом виде:.

Есть много библиотек там что некоторая ООП стиль наследование уже встроенных Вы можете свернуть свой тоже, но это не было бы тривиальным.

Я рекомендую раму под названием Joose.

  • Он поддерживает классы, наследование, миксины, черты, модификаторы методов и многое другое.
  • Стабильный и используемый в производственных условиях.
  • Элегантный и сэкономит вам много нажатий клавиш

Использование Joose, родительские конструкторы могут быть перекрыты или дополнены, и SUPER() или INNER() будут предоставлены методы для доступа к конструктор или подкласс конструктор.

+0

Также mootools (http://mootools.net), который выступает за дополнительные объектно-ориентированные инструменты, представляет собой отличную фреймворк OOP для JavaScript. – tj111

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