2014-11-13 2 views
0

Я пытаюсь понять методы вызова методов-конструкторов и прототипов в JavaScript.Составить родительский конструктор и прототип из дочернего объекта

Вот моя попытка:

function A() { 
    this.getId = function() { 
     console.log('A constructor - getId'); 
    } 
} 
A.prototype.getId = function() { 
    console.log('A prototype - getId'); 
} 
function B() { 
    A.call(this); 
    this.getId = function() { 
     console.log('B constructor - getId'); 
    } 
} 
B.prototype = Object.create(A.prototype); 
B.prototype.constructor = B; 

B.prototype.getId = function() { 
    console.log('B prototype - getId'); 
} 
var p = new A(); 
var q = new B(); 

p.getId() 
//A constructor - getId 

q.getId() 
//B constructor - getId 

p.constructor.prototype.getId() 
//A prototype - getId 

q.constructor.prototype.getId() 
//B prototype - getId 

ли последние два способа является правильным способом для вызова методов прототипа?

Как я могу вызвать родительский конструктор и методы прототипа из дочернего объекта q?

+1

помните о своих Ps и Qs, вы переопределяете эти методы, когда идете вперед. – dandavis

+0

@ dandavis Конечно, я использовал его для простоты здесь. – Yogesh

+0

в общем, вам не нужно стремиться к высокому или низкому, красота прототипала заключается в том, что вы можете притворяться, что все это собственная собственность/метод. вам не нужна связь между ними, чтобы добиться повторного использования, и на самом деле ссылка сделает ее неоднозначной и запутанной. вы можете просто сказать B.prototype.getId.call (A) или наоборот из любого места. – dandavis

ответ

1

Итак, как я могу получить

'B прототип - GetId' от д объекта

Поскольку д является экземпляром В. Конструктор B присваивает метод getId непосредственно на экземпляр, так что это тот, который вы получаете. Если вы ожидали, что один на B.prototype, то вам нужно удалить (или не назначать) один на экземпляре:

// delete getId on instance 
delete q.getId; 

// Now get inherited getId 
q.getId() // B prototype - getId 

Обратите внимание, что в удалить оператор работает только на собственные свойства, то не удаляет свойства в цепочке [[Prototype]].

ли последние два способа правильны способ

  1. Вызов родителей метод прототипа с использованием р Родителей метод конструктора, используя
  2. д

«Правильная» в том, что они работают, хотя я бы не планировал его работать таким образом.

+0

Как я могу вызвать конструктор родителей и методы прототипа из дочернего объекта q? – Yogesh

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