2013-12-23 4 views
1

Я наследуемых от Base класса к Derived класса а так:Установка __proto__ прототипа конструктора

говорят Base is View и Derived is ItemVIew

function ItemView(){ 
View.call(this); 
} 

ItemView.prototype.__proto__ = View.prototype 

Может выше быть дружнее только с

Iteview.prototype = new View; 

Также у меня есть еще один вопрос

Когда я набор ItemView.prototype.__proto__ = View.prototype , Прототип ItemView является Function.prototype и это означает, что я ставлю Function.prototype.__proto__ = View.prototype поэтому все методы View.prototype наследуются каждым другим застройщиком я определить?

Могу ли я решить его только ItemView.__proto__ = View.prototype?

Каков рекомендуемый способ расширения базового класса, например View, чтобы ItemView по-прежнему был конструктором?

+0

_proto прототипа - это объект или его конструктор. вы используете _proto для экземпляров, .prototype для конструкторов. это по сути то же самое, что и instance.constructor.prototype. – dandavis

ответ

4

Объект, на который ссылается ItemView.prototype, является тем, что будет использоваться как базовый прототип объектов, созданных с помощью new ItemView. ItemView.prototype.__proto__, скорее всего, (по его реализациям) будет Object.prototype.

Но нет, вы не хотите делать ItemView.prototype = new View(); - что делать, если View нужны аргументы? Это очень распространенная ошибка.

Вместо этого в предварительно ES5 среде:

function Temp() { 
} 
Temp.prototype = View.prototype; 
ItemView.prototype = new Temp(); 
ItemView.prototype.constructor = ItemView; 

В среде ES5:

ItemView.prototype = Object.create(View.prototype); 
ItemView.prototype.constructor = ItemView; 

... и продолжают делать ваши View.call(this) изнутри ItemView.

+0

Что необходимо для ItemView.prototype.constructor = View? –

+1

@ RanaDeep: чисто соглашение. Именно так настроен объект 'prototype' по умолчанию для функций JavaScript, поэтому мы делаем то же самое. Это немного странность: [спецификация говорит, что создает это свойство] (http://www.ecma-international.org/ecma-262/5.1/#sec-13.2) (шаг 17), что заставляет вас думать, что это важный; но на самом деле он не использует * это свойство для чего-либо. (Это, например, не используется с 'instanceof'.) Подражание тому, что движок делает по умолчанию, действительно дешево, поэтому я всегда это делаю. –

+0

@RanaDeep: BTW, вы можете найти мой вспомогательный скрипт для иерархий наследования ([Lineage'] (http://code.google.com/p/lineagejs/)) полезно, если не для самого скрипта, возможно, только для [эта страница документации] (http://code.google.com/p/lineagejs/wiki/ComparisonWithPlainJavaScript), показывающая ее использование, а не ее использование (например, делать то же самое без помощника). –

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