Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/365.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 JS OOP:原型上的方法与构造函数中的方法_Javascript_Oop_Constructor_Prototype - Fatal编程技术网

Javascript JS OOP:原型上的方法与构造函数中的方法

Javascript JS OOP:原型上的方法与构造函数中的方法,javascript,oop,constructor,prototype,Javascript,Oop,Constructor,Prototype,让我举前两个例子 例1: function Gallery() { this.a = "I am 'A'"; this.trace = function() { console.log(this.a); } } 例2: function Gallery() { this.a = "I am 'A'"; } Gallery.prototype.trace = function () { console.log(this.a); } 显

让我举前两个例子

例1:

function Gallery() {
    this.a = "I am 'A'";

    this.trace = function() {
        console.log(this.a);
    }
}
例2:

function Gallery() {
    this.a = "I am 'A'";
}

Gallery.prototype.trace = function () {
    console.log(this.a);
}
显然,这两件事都是一样的。我的问题是:与原型函数相比,在构造函数中使用方法定义有什么缺点吗?到底有什么区别

原型是否对内存更友好?我假设如果我在构造函数中定义方法,那么每个库实例都会有自己的方法实例,因此会消耗更多内存,而原型只定义一个在所有库实例中共享的函数。这是正确的吗


非常感谢

构造函数中的方法定义速度较慢,因为每次创建新对象时都会执行它

另一方面,有了
原型
,虚拟机将能够优化对它的访问,优化功能(因为它们是共享的——如果每个实例都有自己的功能,它就无法做到)

(不太详细,因为已经解释过了,但基本上,VMs(我知道v8会这样做,不确定其他人会做什么)对于每个原型通常都是一个“隐藏类”,带有优化的字段,而不是将其作为any=>any的映射)

这也允许在以后添加函数时有更多的灵活性


在对象上添加方法的唯一好处是,您可以更容易地伪造“私有”字段。

如果将
.trace()
放在构造函数中,每个
对象将有自己的
.trace()
函数对象,这是正确的,因此,在
.prototype
对象中生成方法更有效,除非您绝对希望使用封装来隐藏传递到构造函数中的参数,而不是将它们保存为实例上的属性。
.prototype
对象也更易于浏览器优化

这两种方法在实践中几乎无法区分,除非编码人员尝试使用他的JavaScript控制台检查JavaScript代码,在这种情况下,他们可以更容易地读取
.prototype
对象上的方法,而不是将所有内容都放在构造函数中。你想拿什么就拿什么