2013-02-22 4 views
0

Из того, что я понимаю, объект Prototype является объектом, из которого другие объекты наследуют свойства и методы, и в основном он содержит свойство Constructor, которое ссылается или указывает на функцию конструктора, которая создал Object.Please Рассмотрим следующий код:Использование свойств прототипа и конструктора JS совместно

function Animal() 
{ 
this.name="no name"; 
} 

function Cat() 
{ 
    Animal.Call(this);   //Please Explain 
    this.mood="sleepy"; 
} 

Cat.prototype=new Animal();  //Cat inheriting Animal? 
Cat.prototype.constructor=Cat; //Please Explain 

Пожалуйста, четко объяснить, но в деталях строк кода с комментариями и концепции отражения, спасибо.

+1

Возможно, вы имеете в виду 'Animal.call (this);'. И что именно вы хотите объяснить? Что такое '.call'? Почему он там? Или что? Кстати, лучше настроить прототип - это «Cat.prototype = Object.create (Animal.prototype);». В этот момент в вашем коде вы не хотите создавать новый экземпляр «Animal». –

+0

да, я хотел бы знать, что является целью 'Animal.call (this)' и 'Cat.prototype.constructor = Cat;' спасибо. – MrShabana

ответ

1

что Цель Animal.call(this)

Это как вызов super() на других языках программирования. Он вызывает родительский конструктор (Animal) только что созданного нового объекта (this). Это также объясняется в MDN documentation about .call.

В вашем примере Animal присваивает "no name" до this.name. Поэтому после звонка Animal.call(this);, this будет иметь свойство name с вышеуказанным значением.

и Cat.prototype.constructor=Cat;

По умолчанию для каждого прототипа constructor свойство указывает на функцию она принадлежит. Но поскольку вы перезаписываете прототип с Cat.prototype=new Animal();, свойство constructor указывает на другую функцию. В этом случае, поскольку new Animal возвращает объект, который наследуется от Animal.prototype, Cat.prototype.constructor будет указывать на Animal. Чтобы исправить это, мы снова назначим Cat.

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

+0

благодарит Феликса, что было очень полезно – MrShabana

+0

Добро пожаловать! –

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