在原型与构造函数中声明属性?优点和缺点?

时间:2019-01-12 02:54:22

标签: javascript inheritance prototype prototypal-inheritance

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

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

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

**这是否意味着如果我继承如下所示的parent方法,我将引用复制到方法还是实际复制? **

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 :(得分:2)

您有一些混淆的地方。尝试从面向对象的角度理解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)