0

我一直在使用以下模板在 javascript 中创建对象。

function FileSpec(directory, filename){
  var object = {};
  object.full_path = function(){
    return directory + '/' + filename;
  }
  return object;
}

var filespec = FileSpec('tmp', 'index.html');

使用上述实现与使用原型和新实现相比有什么特别的缺点吗?

function FileSpec(directory, filename){
  this.directory = directory;
  this.filename = filename;
}

FileSpec.prototype.full_path = function(){
  return this.directory + '/' + this.filename
}

var filespec = new FileSpec('tmp', 'index.html');
4

1 回答 1

2
  1. 您不能使用1 有效地使用instanceof运算符或Object.isPrototypeOf()方法,但可以使用 #2。

    filespace instanceof FileSpec; // false with 1, true with 2
    Filespec.isPrototypeOf(filespace); //false with 1, true with 2
    
  2. 使用prototype继承时,原型成员(方法等)仅在原型上定义一次。在 #1 中,您要在每个实例上定义一组新成员,这会占用更多内存。

    var ar = [];
    
    for (var i=0;i<10000000;i++) {
        ar.push(FileSpec('tmp', 'index.html'));
    }
    
    // check memory usage, cry.
    

    相比:

    var ar = [];
    
    for (var i=0;i<10000000;i++) {
        ar.push(new FileSpec('tmp', 'index.html'));
    }
    
    // check memory usage.
    
于 2013-01-09T14:29:42.147 回答