Javascript 什么&x2019;原型的目的是什么?

Javascript 什么&x2019;原型的目的是什么?,javascript,prototype-programming,Javascript,Prototype Programming,可能重复: 好的,我对JS中的OOP有点陌生 下面编写的这两段代码之间有什么区别: function animal(){ this.name = 'rover'; this.set_name = function(name){ this.name = name; } } 它们都做相同的事情,那么有什么区别呢?使用原型可以更快地创建对象,因为不必在每次创建新对象时都重新创建原型上的属性/方法 执行此操作时: 功能动物(){ this.name='rov

可能重复:

好的,我对JS中的OOP有点陌生

下面编写的这两段代码之间有什么区别:

function animal(){
    this.name = 'rover';
    this.set_name = function(name){
         this.name = name;
    }
}

它们都做相同的事情,那么有什么区别呢?

使用原型可以更快地创建对象,因为不必在每次创建新对象时都重新创建原型上的属性/方法

执行此操作时:

功能动物(){
this.name='rover'
this.set_name=函数(名称){
this.name=name
}
}
每次创建动物时都会创建
set\u name
方法。但当你这么做的时候

animal.prototype.set_name=函数(名称){
this.name=name
}
方法不必每次都重新创建;它存在于原型的一个地方。所以当你调用某个动物时,设置名称(“Ubu”)this上下文将被设置为
someAnimal
,并且(唯一的)
set\u name
方法将被调用


但是,使用第一种语法有一个优点:以这种方式创建的方法将可以访问私有数据:

功能动物(){
var privateData='foo'
this.name='rover'
this.set_name=函数(名称){
this.name=name
警报(privateData)//将向“foo”发出警报
}
}

Douglas Crockford调用像这样创建的方法是“特权”的,原因是:它们可以访问公共和私有数据。

当您从这些函数创建新对象时,会出现差异

var animal1 = new animal();

第一个函数创建的所有对象将具有不同的
名称
设置名称
属性。但是,由第二个函数创建的所有对象将共享
set\u name
属性

在第一个示例中,每个单独的动物都有自己的set_name函数属性,而在第二个示例中,它们通过原型共享相同的函数

第一个版本的优点是,这些方法可以访问构造函数中声明的局部(私有)变量

第二种方法的优点是它需要更少的内存(因为只存储一次而不是一百万次),并且在当前的JS引擎中更具性能

使用第二种方法,您还可以修改或向类添加方法,其方式也会影响已创建的实例。

类的实例级共享成员(非静态)。e、 g)Person.prototype.instance_计数器=0//无法使用类名称(如Person.instance_计数器)访问(这是静态的。)
var animal1 = new animal();