Javascript JS OOP:原型上的方法与构造函数中的方法
让我举前两个例子 例1: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); } 显
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
对象上的方法,而不是将所有内容都放在构造函数中。你想拿什么就拿什么