Вопрос по prototypal-inheritance, constructor, prototype-programming, javascript – почему перечисление фактического конструктора класса в JavaScript важно

7

Я читал в саду JavaScripthttp://bonsaiden.github.com/JavaScript-Garden/ о прототипе в JavaScript и один из его примеров выглядит следующим образом:

function Foo() {
    this.value = 42;
}
Foo.prototype = {
    method: function() {}
};

function Bar() {}

// Set Bar's prototype to a new instance of Foo
Bar.prototype = new Foo();
Bar.prototype.foo = 'Hello World';

// Make sure to list Bar as the actual constructor <-------------------
Bar.prototype.constructor = Bar;

Обратите внимание на строку с надписью Убедитесь, что в качестве фактического конструктора указан Bar. Я действительно заблудился о том, что это делает / является. Я попытался сделать новые экземпляры Bar () с и без последней строки. Но вызов «value» или «method» в тех случаях возвращает те же самые вещи. Итак, мне интересно, зачем нужно (я предполагаю, что он должен быть) указания конструктора?

Благодарю вас!!!

Ваш Ответ

2   ответа
2

что это связано с созданием экземпляра Bar с новым ключевым словом. Я полагаю, что использование new будет искать Bar.prototype.constructor. Перед этой строкой объект, связанный с Bar.prototype.contructor, имеет тип Foo, поэтому при создании экземпляра без этой строки он создаст объект Foo вместо объекта Bar.

Пожалуйста! Если бы это помогло, ты мог бы +1 это? Keith.Abramo
Спасибо Кит! ; Это краткое и конкретное объяснение, а также Nik So
6

prototype свойство, оно присваивается при создании объекта функции, оно указывает на вновь созданный объект, который наследуется отObject.prototypeи имеетconstructor свойство, которое просто указывает на саму функцию.

Цельprototype Свойство заключается в том, чтобы дать способ реализовать наследование, используя функции конструктора. Когда вы вызываете функцию сnew оператор, он создаст новый объект, который наследует от этого конструктораprototype.

Теперь цельconstructor Свойство должно иметь способ обратиться к конструктору, который создал объект, например:

function Foo () {}
// default value of the property:
Foo.prototype.constructor == Foo; // true

Это свойство наследуется "экземплярами"Foo, так что вы можете знать, какой конструктор использовался для создания объекта:

var foo = new Foo();
foo.constructor == Foo;

Если вы назначите новый объект прототипу функции, эта связь будет потеряна:

function Bar () {}
Bar.prototype = { inherited: 1 };

Bar.prototype.constructor == Bar;    // false
Bar.prototype.constructor == Object; // true

И это влияет также на экземпляры функции:

var bar = new Bar();
bar.constructor == Bar;    // false
bar.constructor == Object; // true

Другой подобный случай, когда у вас есть два или более уровня наследования с использованием конструкторов, наиболее распространенный способ используется для обозначения отношений наследования между функциями, это назначитьprototype свойство второго уровня, например:

function Parent() {}

function Child () {}
Child.prototype = new Parent();

Приведенный выше код имеет несколько проблем, во-первых, он выполняет логику родительского конструктора для создания отношений наследования, но это уже другая история, в приведенном выше примереconstructor свойство также затрагивается, так как мы полностью заменяемChild.prototype объект:

var child = new Child();
child.constructor == Parent; // true

Если мы заменим заменить значениеconstructor собственностьюChild.prototype после назначения он покажет ожидаемое поведение:

function Child() {}
Child.prototype = new Parent();
Child.prototype.constructor = Child;

var child = new Child();
child.constructor == Child; // true
@ Ник, пожалуйста! Да, это действительно круговой дизайн, например:Object.prototype.constructor.prototype.constructor.prototype.constructor == Object; ;-) CMS
Спасибо за такое подробное объяснение. Все это имеет смысл. Единственное, что до сих пор меня беспокоит, но я могу не заметить, это выглядит немного круглым в Child.prototype.constructor = Child Nik So

Похожие вопросы