Вопрос по javascript – Прототип наследования и новое ключевое слово

2

В backbone.js по методу наследования авторы делают это:

var ctor = function() {};
// some other code ...

var child;
// some other code ...
ctor.prototype = parent.prototype;
child.prototype = new ctor();

Вышесказанное, насколько я понимаю, позволяет новому объекту наследовать прототипную цепочку родителя. Я пытаюсь обдумать это, но на практике, есть ли разница между вышеизложенным и непосредственным назначением прототипа?

child.prototype = parent.prototype

Я понимаю, что существует этот [[prototype]] объект, к которому нельзя получить прямой доступ, если только через ключевое слово new. Однако, учитывая, что большинство объявлений объектов имеют вид

var SomeObj = function() {};
SomeObj.prototype.test = function() { return "Hello World"; }

Каковы будут практические различия в приведенных выше прототипах?

Ваш Ответ

2   ответа
0

Это скрипт, который описывает вышеописанную ситуацию

var x = {
    // do nothing
};

var a = function() {};

a.prototype = x;

var b = new a();
console.log("b.__proto__ is x? " + (b.__proto__ == x)); // true

var c = function() {};
c.prototype = new a();
console.log("c prototype.__proto__ is x? " + (c.prototype.__proto__ == x)); // true

var anotherFn = function() {
    // do nothing
};
c.prototype.aFn = anotherFn;

var d = new c();
console.log("d __proto__^2 is x?" + (d.__proto__.__proto__ == x)); // true
console.log("d __proto__.aFn is anotherFn? " + (d.__proto__.aFn == anotherFn)); // true
3

instance родительского типа. С помощьюchild.prototype = parent.prototype установил бы прототип потомка равным прототипу родителя, а не прототипный экземпляр родителя.

Вот этоhuge problem что возникает, если вы используетеchild.prototype = parent.prototypeЕсли вы пытаетесь изменить прототип дочернего элемента, вы также изменяете прототип родительского элемента, поскольку они являются одним и тем же объектом.

Child.prototype.childOnlyValue = 5;
// WARNING: Parent.prototype.childOnlyValue is now also 5,
//             because Parent.prototype === Child.prototype

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

Error: User Rate Limit ExceedednewError: User Rate Limit ExceedednewError: User Rate Limit Exceeded johncch
Error: User Rate Limit ExceedednewError: User Rate Limit Exceeded__proto__Error: User Rate Limit Exceeded__proto__Error: User Rate Limit ExceededObject).
Error: User Rate Limit Exceeded johncch

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