Javascript 使用原型优于在构造函数中创建函数?

Javascript 使用原型优于在构造函数中创建函数?,javascript,Javascript,这是一个动物对象的构造函数 function Animal(name, sound) { this.name = name; this.sound = sound; this.makeSound = function() { alert(sound); } } 我发现开发人员可以通过 Animal.prototype.makeSound = function() { alert(this.sound); }; 并从构造函数中排除makeSound方法。使

这是一个动物对象的构造函数

function Animal(name, sound) {
   this.name = name;
   this.sound = sound;
   this.makeSound = function() {
       alert(sound);
   }
}
我发现开发人员可以通过

Animal.prototype.makeSound = function() { alert(this.sound); };

并从构造函数中排除makeSound方法。使用此原型设计模式的优点是什么?

原型版本只应创建一次并存储在内存中,而构造函数版本将在内存中创建新函数并与对象一起存储


这更像是一种内存管理。在功能上,它几乎是一样的

对象实例的原型“存在”。当您创建其中一个对象时,该数据将被优化为已经存在,而不是在每次实例时更改该对象。。。还有Tejs刚才说的。

此外,您可以公开访问原始方法(
Animal.prototype.makeSound
),该方法可能很有用。

在这两种情况下,每个新对象有多少个函数对象?我认为这两种情况下都有很多对象。只有
function()
创建了一个新的函数对象。无论哪种情况,都会为以下对象创建许多函数对象:
animals=[];对于(i=0;i<1000;i++){animals.push(new Animal())}
同样,修改
原型
会影响其中包含其
[[prototype]]
链的所有对象。哦,谢谢你,所以从构造函数实例化的所有对象默认情况下都通过
\uuuuuuproto\uuu
属性引用相同的原型对象,
constructor.prototype
属性。
\uuuu proto\uuuu
属性是一些浏览器(如FF?)中公开的实现细节;如果这是标准,那就好了,但事实并非如此。使用的
[[prototype]]
被视为构造函数的对象
。prototype
属性在
新建构造函数时计算为(从技术上讲,可以在
新建
调用之间更改
prototype
属性,但我不能说我看到这样做了…)