在 Prototype 与 Constructor 函数中声明属性?优点和缺点?

Declaring properties in Prototype vs. Constructor function? Pros and Cons?

我很难理解为什么我应该在构造函数 class 或其原型对象上定义属性。

这是我对原型的理解 - 在原型中声明属性(而不是链接的父对象)可以节省性能,因为每个子对象不会有自己的父属性的 COPY。

问题:但我认为您不能从非原始类型复制值,即函数对象仅传递引用...并且只能从原始类型复制?

**这是否意味着如果我像下面这样继承父类的方法,我是在复制对方法的引用还是实际复制? **

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

你把一些事情搞混了。当试图从 OO 的角度理解 javascript 时,这很常见,因为它不是很合适。也许这会有所帮助:

这只是一个函数(当使用 new 调用时)returns 和 object:

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

object 它 returns 每次都是新创建的,object 就是 this 所引用的。所以每次你 运行 它,它都会生成一个 object,给 object 一个 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)

值不是继承的,它只是在调用函数时分配给 object。 Parent 只是一个函数。

像所有函数一样 Parent 有一个 prototype 属性。当它用 new 生成 object 时,它会 link 那 object 到它的 prototype。如果您尝试在返回的 object 上查找 属性 但找不到,则 javascript 将查找 parent 原型。当您分配 child.age = 10 时,现在 child 有自己的年龄 属性。它不再需要查看原型。如果它没有自己的属性,它只会在原型上查找属性。

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)