原型的目的是什么?

2022-08-30 00:46:47

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

好吧,所以我对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;
}

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


答案 1

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

执行此操作时:

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");thissomeAnimalset_name


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

function animal() {
    var privateData = 'foo'

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

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


答案 2

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

var animal1 = new animal();

由第一个函数创建的所有对象将具有不同的属性。但是,由第二个函数创建的所有对象将共享该属性。nameset_nameset_name