2015-05-30 4 views
2

Я хочу узнать конкретный конструктор, используемый для создания экземпляра объекта в javascript, а не тот, который является последним в цепочке прототипов. Рассмотрим код:Поиск конструктора в многоуровневом наследовании

function F(){}; 
function E(){}; 
function D(){}; 
function C(){}; 
function B(){}; 
function A(){}; 

E.prototype= new F(); 
D.prototype= new E(); 
C.prototype= new D(); 
B.prototype= new C(); 
A.prototype= new B(); 

a=new A(); 

Поиск скрипку here

a.constructor возвращается function F(){}, но я хочу метод, который возвращает function A(){}, поскольку A является конструктор используется для создания экземпляра объекта.

Как это можно достичь?

+0

a.constructor.prototype дает мне F. –

+0

я написал пост о «правильном» пути наследование настроек в JavaScript http://js-bits.blogspot.com/2010/08/javascript-inheritance-done-right.html –

+0

вы можете проверить [classy.js] (https://github.com/classy,js) для java-подобных функций OOP (и поддержки для sweet.js) (я автор) –

ответ

3

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

A.prototype = new B(); 

A.prototype.constructor действительно указывает на B не A больше.

С помощью этого шаблона для прототипического наследования вам необходимо вручную установить конструктор вручную. Таким образом, вы либо сделать это для каждого расширенного класса вручную или вы можете использовать вспомогательную функцию:

function inherit(C, P) { 
 
    C.prototype = new P(); 
 
    C.prototype.constructor = C; 
 
} 
 

 
function F(){}; 
 
function E(){}; 
 
function D(){}; 
 
function C(){}; 
 
function B(){}; 
 
function A(){}; 
 

 
inherit(E, F); 
 
inherit(D, E); 
 
inherit(C, D); 
 
inherit(B, C); 
 
inherit(A, B); 
 

 
var a = new A(); 
 
var c = new C() 
 

 
document.write(a.constructor + "<br>"); 
 
document.write(c.constructor);

+0

Вы должны научить OP, что создание базового класса просто для настройки наследования является плохим. http://js-bits.blogspot.com/2010/08/javascript-inheritance-done-right.html. используйте 'C.prototype = Object.create (P.prototype);' –

+0

Спасибо dfsq за то, что указали мне в правильном направлении, я обнаружил через [link] (https://developer.mozilla.org/en-US/docs/ Web/JavaScript/Reference/Operators/new), что новый оператор для конструктора Foo создает новый объект, который наследуется от Foo.prototype. Foo.prototype имеет свойство constructor, присваивая A.prototype новому B(), объект-прототип, содержащий свойство конструктора, по существу, перегружен (вплоть до E), что приводит к поиску в цепочке прототипов last Object типа F.Hence нам нужно присвоить свойство конструктора. – user1707873

0

Вы отметили Class.js от Джона Ресига? http://ejohn.org/blog/simple-javascript-inheritance/ Он реализует наследование в javascript и делает возможным то, о чем вы просите.

Редактировать: Извините. Я был неправ. Тем не менее, вы можете добавить что-то вроде этого к вашим описаниям:

A.prototype= new B(); 
A.prototype.constructor = B; 

Не уверен, что все последствия это может иметь, но это, кажется, работает!

+0

Опубликовать больше информации Пример кода может быть – inye

1

Выполните следующие действия:

function F(){}; 
function E(){}; 
function D(){}; 
function C(){}; 
function B(){}; 
function A(){}; 

E.prototype= new F(); 
E.prototype.constructor = E; 
D.prototype= new E(); 
D.prototype.constructor = D; 
C.prototype= new D(); 
C.prototype.constructor = C; 
B.prototype= new C(); 
B.prototype.constructor = B; 
A.prototype= new B(); 
A.prototype.constructor = A; 
+0

'A.prototype.constructor = A;' должно быть достаточно, не так ли? – sarbbottam

+0

Если вас интересует только объект 'A', тогда да, этого достаточно. – Karlen

+0

@sarbottam на самом деле, вы не должны исправлять проблему повсюду, OP явно говорит в общих чертах –

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