2015-10-06 4 views
2

Мне не удалось найти ясного объяснения этого. Это простой пример, который я нашел на MDN. Единственное, что я не понимаю, это почему конструктор установлен. Может кто-нибудь объяснить, почему это необходимо? Это для наследования и для правильной последовательности прототипов?Какова цель установки prototype.constructor

// Shape - superclass 

function Shape() { 
    this.x = 0; 
    this.y = 0; 
} 

// superclass method 
Shape.prototype.move = function(x, y) { 
    this.x += x; 
    this.y += y; 
    console.info('Shape moved.'); 
}; 

// Rectangle - subclass 
function Rectangle() { 
    Shape.call(this); // call super constructor. 
} 

// subclass extends superclass 
Rectangle.prototype = Object.create(Shape.prototype); 
Rectangle.prototype.constructor = Rectangle; 

var rect = new Rectangle(); 

console.log('Is rect an instance of Rectangle?', rect instanceof Rectangle);// true 
console.log('Is rect an instance of Shape?', rect instanceof Shape);// true 
rect.move(1, 1); // Outputs, 'Shape moved.' 
+2

увидеть это [Почему необходимо установить конструктор прототипа?] (Http://stackoverflow.com/questions/8453887/why-is-it-needed-to-set-the-prototype-constructor) – TwilightSun

+1

@TwilightSun: обратите внимание, что вы можете пометить вопрос как дубликат, который будет генерировать автоматический комментарий для вас, а также позволит пользователям узнать, кто имеют право отмечать вопросы как дубликаты. –

+0

Возможный дубликат [Почему необходимо установить конструктор прототипов?] (Http://stackoverflow.com/questions/8453887/why-is-it-necessary-to-set-the-prototype-constructor) – zer00ne

ответ

0

Всякий раз, когда вы создаете функцию, скажем, function foo(){}, двигатель JS также создает анонимный объект и соединяет два аналогичным образом.

foo.prototype = {}; 
foo.prototype.constructor = foo; 

enter image description here

имена свойств "Конструктор" и "прототип" так только из-за семантики. Вполне возможно, что стандартные имена были:

foo.ping = {}; 
foo.ping.pong = foo; 

И «цель создания prototype.constructor» проста - чтобы иметь возможность использовать функцию конструктор этого класса.

Если вам не нужно вызывать функцию конструктора, вы можете полностью опустить это свойство.

Чтобы узнать больше об этой теме я рекомендую чтение http://www.javascripttutorial.net/javascript-prototype/ и http://www.javascripttutorial.net/javascript-prototypal-inheritance/