在 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)
我很难理解为什么我应该在构造函数 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)