原型的目的是什么?

IT技术 javascript prototype-programming
2021-01-18 09:05:26

可能的重复:
在 JavaScript 中使用“原型”与“这个”?

好的,所以我对 JS 中的 OOP 的想法有些陌生。

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

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

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

3个回答

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

当你这样做时:

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

set_name每次创建动物时都会创建方法。但是当你这样做时

animal.prototype.set_name = function (name) {
    this.name = name
}

不必每次都重新创建该方法;它存在于原型中的一处。因此,当您调用上下文someAnimal.set_name("Ubu");this上下文将被设置为someAnimal和(唯一的)set_name方法将被调用。


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

function animal() {
    var privateData = 'foo'

    this.name = 'rover'
    this.set_name = function (name) {
        this.name = name
        alert(privateData) //will alert 'foo'
    }
}

出于这个原因,道格拉斯·克罗克福德 (Douglas Crockford) 将像这样创建的方法称为“特权”:它们可以访问公共数据和私有数据。

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

var animal1 = new animal();

由第一函数创建的所有对象都会有不同的nameset_name特性。但是,第二个函数创建的所有对象都将共享该set_name属性。

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

第一个版本的优点是方法可以访问在构造函数中声明的本地(私有)变量。

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

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