Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/431.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/joomla/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用';这';原型属性上的构造函数中的关键字?_Javascript - Fatal编程技术网

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您无法处理其中一个,也无法处理另一个。这不是区别所在。你可以完成任何你想做的事情,甚至不用碰原型。它可能没有那么有效,或者可能会更有效,这取决于你怎么做。在一个例子中,你为每个实例重新做,在另一个例子中,所有实例共享同一个实例。您选择的值应基于是希望在所有实例之间共享值,还是特定于每个实例。感谢您的支持