Javascript Prototype Property ' - PullRequest
       17

Javascript Prototype Property '

0 голосов
/ 30 сентября 2019

Я следую логике в javascript, касающейся «конструкторов функций» и «цепочек прототипов», однако я пытаюсь понять важность цепочки прототипов с точки зрения того, как именно она нужна.

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

Если свойство prototype не создает ссылку между локальным и глобальным контекстом объектов, зачем его включать? вообще? Если я опущу свойство prototype из списка свойств конструктора функции, что изменится?

Мне просто нужна четкая и краткая причина назначения свойства prototype, которое на данный момент имеет некоторый смысл, но все же не имеет смыслас точки зрения того, как оно способствует цепочке наследования.

Спасибо за чтение.

Ответы [ 2 ]

0 голосов
/ 30 сентября 2019

Мне просто нужна четкая и краткая причина назначения свойства прототипа, которое на данный момент имеет некоторый смысл, но все еще не имеет смысла с точки зрения его вклада в цепочку наследования.

Давайте возьмем этот код для примера:

function Foo(prop) {
  this.fooProperty = prop
}

Foo.prototype.greetFoo = function() {
  console.log('hi from foo')
}

function Bar(prop1, prop2) {
  Foo.call(this, ...arguments)
  this.barProperty = prop2
}

// Replace the default Bar.prototype object with one that links to Foo.prototype
Bar.prototype = Object.create(Foo.prototype)
Bar.prototype.greetBar = function() {
  console.log('hi from bar')
}

const barInstance1 = new Bar('baz', 'rar')
const barInstance2 = new Bar('qum', 'yas')

barInstance1.greetFoo()
barInstance2.greetFoo()
barInstance1.greetBar()
barInstance2.greetBar()

Приведенное выше приведёт к следующей цепочке прототипов:

Object.prototype <- Foo.prototype <- Bar.prototype <- barInstance1
                    > greetFoo()     > greetBar()     > fooProperty = 'baz'
                                                      > barProperty = 'rar'
                                                   <- barInstance2
                                                      > fooProperty = 'qum'
                                                      > barProperty = 'yas'

В традиционных ООП классы являются «чертежами», а экземпляры - объектами, созданными из«сплющенные / объединенные» чертежи иерархии наследования экземпляра класса. JS «Наследование» работает иначе, чем это. Наследование JS работает с использованием иерархии связанных, живых объектов, а не чертежей.

Когда вы обращаетесь к чему-то в экземпляре, которого у экземпляра нет (например, greetFoo() и greetBar()), JS будет рекурсивно искать цепочку, чтобы найти ее. Эта цепочка может включать другие прототипы с большим количеством функций. Вот как работает JS «Обмен кодом».

В приведенном выше примере

  • barInstance1 и barInstance2 связаны с Bar.prototype. Оба экземпляра теперь имеют greetBar().
  • Bar.prototype, а также ссылки на Foo.prototype, что означает, что экземпляры также получают greetFoo.
  • Наконец, Foo.prototype ссылки на встроенныев Object.prototype предоставление всем экземплярам доступа ко всем собственным методам объектов, таким как hasOwnProperty, toString() и т. д.
0 голосов
/ 30 сентября 2019

Если вы выполните следующую строку кода

function Dog(){
    this.constBreed = "Pug";
}
Dog.prototype.breed = "Bull";

var newDog = new Dog();

console.log(newDog);

Журнал даст вам результат ниже

Dog {constBreed: "Pug"}
    constBreed: "Pug"
    __proto__:
        breed: "Bull"
        constructor: ƒ Dog()
        __proto__: Object

Здесь переменная конструктора "constBreed" напрямую присоединена к "newDog"объект, а свойство прототипа "breed" переходит в proto chain.

Так что это очень полезно, потому что мы можем создать несколько новых переменных Dog из функции Dog () и изменить их породувсе сразу, просто изменив protopye.breed самой функции Dog ().

И в случае конструкторской переменной "constBreed" он просто копируется и заново инициализируется для каждого нового объекта, который вы создаете из функции Dog ().

...