То что в свойстве .prototype ещё не прототип, это станет прототипом когда выполнится new.
Так я же выполняю new в строке 14?
А в свойстве .prototype ничего нет.
не понятно( Вот пример наследования в строке 4 понятен и нагляден. А как то можно сделать также в строке 12?
Ну ты берёшь классический и понятный пример наследования и хочешь его извратить, с какой целью? const myPrototype = { prop: 1 } function A () {} const instance = new A() Object.setPrototypeOf(instance, myPrototype) console.log(instance.prop)
setPrototypeOf в __proto__ пишет помойму
цель уйти от proto в сторону Object.setPrototypeOf
https://developer.mozilla.org/ru/docs/Web/JavaScript/Reference/Global_Objects/Object/proto вот тут написано, что __proto__ не рекомендуется использовать
const myPrototype = { prop: 1 } function A () {} A.prototype = Object.create(myPrototype) const instance = new A() console.log(instance.prop)
вот я и решил переписать с __proto__ на что-то другое, более стандартизированое
Сеттер proto действительно не красивый.
ты в коде new Делаешь, а new устаналивает свой прототип
new не устанавливает свой прототип, new создает новый объект в котором прототип НЕ создается. Но когда обращаешся к свойству которого нет в объекте он ищет его в прототипе который уже был создан. Да же наверно так, прототип как объект создается только 1 раз, а новые объекты создаются при каждом новом new Или я не прав?
new создаёт новый объект без прототипа, выполняет в его контексте функцию-конструктор, и выставляет этому объекту тот объект прототипа что был в свойстве .prototype
function _new(constructor, ...args) { const ctx = { __proto__: constructor.prototype } constructor.call(ctx, ...args) return ctx }
Кстати всегда хотел узнать как расшифровываются эти три буквы ctx?
В данном примере мы видим две цепочки прототипов. В момент выполнения new происходит как бы их "переключение". function A () {} A.staticMethod = function () { console.log('static') } A.prototype.prototypeMethod = function () { console.log('proto') } function B () {} Object.setPrototypeOf(B, A) B.prototype = Object.create(A.prototype) B.prototype.constructor = B B.staticMethod() const instance = new B() instance.prototypeMethod()
Спасибо!
В вашем примере B.prototype = Object.create(A.prototype) Почему нельзя написать вот так? B.prototype = A.prototype
Можно, но прототипы должны расширяться. В инстансе объекта B будут дополнительные свойства для B, которые не нужны в A.
кста, зачем ты вообще с этим возишься? почему class не возмешь?
Я отказался от class так как там нельзя узнать имя функции из самой функции Этот метод не работает, а альтернативы я не нашел var Foo = function() { arguments.callee.name;// Foo };
Понял, спасибо!
Нет, имя метода
ну через строку узнай
Обсуждают сегодня