Javascript 使用';这';原型属性上的构造函数中的关键字?
在下面的代码中,我实例化了一个对象,它以两种完全不同的方式继承属性Javascript 使用';这';原型属性上的构造函数中的关键字?,javascript,Javascript,在下面的代码中,我实例化了一个对象,它以两种完全不同的方式继承属性 function C(){ this.k1 = "v1"; } C.prototype.k2 = "v2"; var o = new C; 第一个(k1)似乎作为“自己的”属性附加到实例化对象(o),第二个(k2)不附加到实例化对象中的任何内容,但似乎只是通过属性(或[[prototype]])访问它的值。在某种程度上,第一种方法类似于(在每种计算中)在桌面上制作文件的“副本”,而第二种方法类似于在桌面上制作文件的“别
function C(){
this.k1 = "v1";
}
C.prototype.k2 = "v2";
var o = new C;
第一个(k1)似乎作为“自己的”属性附加到实例化对象(o),第二个(k2)不附加到实例化对象中的任何内容,但似乎只是通过属性(或[[prototype]])访问它的值。在某种程度上,第一种方法类似于(在每种计算中)在桌面上制作文件的“副本”,而第二种方法类似于在桌面上制作文件的“别名”,当然,在这个类比中,我将“文件”与“属性”相类似
我想知道这是否是想象正在发生什么的正确方法,如果是的话,使用一种方法比使用另一种方法有什么好处和缺点。我假设使用prototype属性可以节省内存,因为它不会强制新实例化的对象(o)将键(k1)作为“自己的”属性,但可能我错了
为什么有人会选择一种方法而不是另一种
我想知道这是否是想象发生了什么的正确方式
对
为什么有人会选择一种方法而不是另一种
.prototype
- 值在所有实例之间共享
- 因此占用的内存更少,速度更快:
This
绑定)尤其有益
此
- 值特定于每个实例
- 在那里定义的方法有闭包,可以访问构造函数范围,因此允许
.prototype
- 值在所有实例之间共享
- 因此占用的内存更少,速度更快:
This
绑定)尤其有益
此
- 值特定于每个实例
- 在那里定义的方法有闭包,可以访问构造函数范围,因此允许
自身属性对于区分实例的数据来说是必要的。将原型视为继承的对象。在经典的OOP世界中,它几乎就像一个父类 使用原型的优点是,对于未自定义
k2
的C
实例,内存中将只存储一个值。但是,如果在实例上设置属性,则会直接在对象中创建一个新属性(hasOwnProperty
将返回true)
缺点是,阅读您的代码的所有人可能都不清楚该值是如何设置的
另外,请记住,如果默认值没有意义,并且您总是需要计算它,那么将其放入原型中就没有什么意义
仅供参考,这就是为什么您经常会看到通过对象的原型绑定到对象的方法,因为它们只定义代码,并且本身通常是无状态的
function C() {
this.blah = function () {
return 1;
};
// other stuff
}
var a = new C();
var b = new C();
内存中有2个名为blah的函数,而不是1个
与:
function C() {
// other stuff
}
C.prototype.blah = function () {
return 1;
};
var a = new C();
var b = new C();
现在,内存中只有一个
blah
函数,绑定到两个单独的对象。将原型视为继承的对象。在经典的OOP世界中,它几乎就像一个父类
使用原型的优点是,对于未自定义k2
的C
实例,内存中将只存储一个值。但是,如果在实例上设置属性,则会直接在对象中创建一个新属性(hasOwnProperty
将返回true)
缺点是,阅读您的代码的所有人可能都不清楚该值是如何设置的
另外,请记住,如果默认值没有意义,并且您总是需要计算它,那么将其放入原型中就没有什么意义
仅供参考,这就是为什么您经常会看到通过对象的原型绑定到对象的方法,因为它们只定义代码,并且本身通常是无状态的
function C() {
this.blah = function () {
return 1;
};
// other stuff
}
var a = new C();
var b = new C();
内存中有2个名为blah的函数,而不是1个
与:
function C() {
// other stuff
}
C.prototype.blah = function () {
return 1;
};
var a = new C();
var b = new C();
现在,内存中只有一个
blah
函数,绑定到两个单独的对象。在一个实例中,您为每个实例重新执行,在其他实例中,所有实例共享同一个。您选择的值应基于是希望在所有实例中共享该值,还是特定于每个实例。谢谢您的帮助,但有什么好处吗?我可以用“自己的”属性重写proto属性。我可以覆盖已经“完成”的属性。虽然它们不同,但从我的立场来看,它们似乎基本上做了相同的事情。如果直接在实例上更新属性,它仍然只会影响该实例,但是,如果在原型上更新属性,它将影响尚未在实例上更新的所有实例。请参见此处:通常情况下,您永远不会在原型上存储可能更改的内容,除非这些内容需要在所有实例中共享,但即使这样,通常最好还是执行其他操作,例如显示模式。@AllanSocks您无法处理其中一个,也无法处理另一个。这不是区别所在。你可以完成任何你想做的事情,甚至不用碰原型。它可能没有那么有效,或者可能会更有效,这取决于你怎么做。在一个例子中,你为每个实例重新做,在另一个例子中,所有实例共享同一个实例。您选择的值应基于是希望在所有实例之间共享值,还是特定于每个实例。感谢您的支持