Объявление свойств в функции Prototype vs. Constructor? Плюсы и минусы? - PullRequest
0 голосов
/ 12 января 2019

Мне трудно понять, почему я должен определять свойства класса конструктора или его объекта-прототипа.

Вот что я понимаю о прототипе - объявление свойств в прототипах (вместо связанного родительского объекта) сохраняет производительность, поскольку у каждого дочернего объекта не будет собственной КОПИИ свойств родительского объекта.

Вопрос: Но я думал, что вы не можете копировать значения из не примитивных типов, т.е. объекты функций только передают ссылки ... и могут копировать только из примитивов?

** Означает ли это, если я наследую методы родителя, как показано ниже, я копирую ссылку на методы или фактически копирую? **

function Parent() {
   this.name = "jeff";
}

var child = new Parent();
console.log(child.name); /// is copied from parent or the reference is copied?? 

В следующем примере я ссылаюсь на прототип ... верно?

Parent.prototype.age = 9;
child.age // I looks at the parent class, then reference to prototype.age.

**** Вопрос 2: ** Если я могу изменить prototype.age для определенного объекта, то я на самом деле скопировал значение правильно? Так в чем смысл, т. Е. **

child.age = 10; // changed the value for THIS object

1 Ответ

0 голосов
/ 12 января 2019

Вы перепутали несколько вещей. Это часто случается при попытке понять javascript с точки зрения ОО, потому что это не очень хорошо подходит. Может быть, это немного поможет:

Это просто функция, которая (при вызове с new) возвращает объект:

function Parent() {
   // create a new object and call it this
   this.name = "jeff";
}

Объект, который он возвращает, создается каждый раз заново, и этот объект - то, на что ссылается this. Поэтому каждый раз, когда вы запускаете его, он создает объект, присваивает этому параметру name значение jeff и выполняет повторную настройку. Проще увидеть, если использовать динамическое свойство:

function Parent() {
    console.log("creating a new object and a new value")
    this.value = Math.floor(Math.random()* 100000);
 }
 
 var child1 = new Parent();
 console.log("child1: ", child1)

 var child2 = new Parent();
 console.log("child2: ", child2)

Значение не наследуется, оно просто присваивается объекту при вызове функции. Parent это просто функция.

Как и все функции Parent имеет свойство prototype. Когда он создает объект с new, он связывает этот объект с prototype. Если вы попытаетесь найти свойство возвращаемого объекта и не сможете его найти, javascript будет искать родительский прототип. При назначении child.age = 10 теперь у ребенка есть собственное свойство возраста. Больше не нужно смотреть на прототип. Он просматривает прототип только для свойств, если он не имеет своих собственных.

function Parent() {
    this.name = "Jeff"
}

Parent.prototype.age = 9
 
var child = new Parent();

// child has no age prop so it looks on the prototype:
console.log(child.age)
console.log("Has age:", child.hasOwnProperty('age'))

child.age = 20
// now child has its own age property. It doens't look at the prototype
console.log("Has age:", child.hasOwnProperty('age'))
console.log(child.age)
...