Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/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-oop。构造器与原型_Javascript_Oop - Fatal编程技术网

javascript-oop。构造器与原型

javascript-oop。构造器与原型,javascript,oop,Javascript,Oop,我可以理解创建和对象作为构造函数和创建文本表示法中的对象的区别,以及何时使用每个定义更好,但我无法理解以下两种情况之间的区别: function Obj(){ this.foo = function(){...} } function Obj(){} Obj.prototype.foo = function(){...} 两者都在做同样的事情。两者都将使用相同的var objNew=new obj()实例化 那么,每个概念的区别和使用时间是什么呢?第一个概念比较慢,因为每次调用构造函数

我可以理解创建和对象作为构造函数和创建文本表示法中的对象的区别,以及何时使用每个定义更好,但我无法理解以下两种情况之间的区别:

function Obj(){
  this.foo = function(){...}
}


function Obj(){}
Obj.prototype.foo = function(){...}
两者都在做同样的事情。两者都将使用相同的
var objNew=new obj()实例化


那么,每个概念的区别和使用时间是什么呢?

第一个概念比较慢,因为每次调用构造函数时都会创建它。

原型由所有实例共享。让我们比较一下:

function Obj(){
  this.foo = function(){...}
}
var o1 = new Obj();
var o2 = new Obj();
console.log(o1.foo === o2.foo); // false

function Obj(){}
Obj.prototype.foo = function(){...}
var o1 = new Obj();
var o2 = new Obj();
console.log(o1.foo === o2.foo); // true
使用原型意味着一次声明原型属性和函数,并且每个人都共享它。一百万个对象,一个
foo
函数


“在构造函数中”方法每次运行时都会为实例创建一个本地
foo
函数。一百万个对象,一百万个
foo
函数都绑定了自己的对象。

并且占用了更多的内存。然而,在构造函数中声明的函数的优点是,这样的函数可以访问在
Obj
的词法范围中声明的任何其他“私有”变量。原型上的函数不能这样做。@Alnitak一旦你要在构造函数体中声明私有实例特定的成员,你就可以扔掉原型,试图克隆这个对象时会非常头疼。我的建议是因为你看不到未来,也不知道这个物体将如何改变;请改用
\u myprivate
。这个问题在搜索之前已经回答了几十次-请尝试搜索。使用构造函数和原型创建对象的说明如下:如果您有任何问题,请告诉我。