1

什么更好?

这个实现

var Animal = function(){
     this.properties = {};
     for(var key in Animal.prototype.properties) this.properties[key] = Animal.prototype.properties[key];
};
Animal.prototype.properties = {
    name: 'animal'
};

或者这个

var AnimalV2 = function(){
    this.properties = Object.create(AnimalV2.prototype.properties);
};
AnimalV2.prototype.properties = {
    name: 'animalv2'
};

当我更改原型属性时,它只会影响第二个实现。

var dog = new Animal()
var cat = new AnimalV2();

Animal.prototype.properties.name = 'hello world';
AnimalV2.prototype.properties.name = 'hello world';

console.log(dog.properties.name); // 'animal'    
console.log(cat.properties.name); // 'hello world'

正如我们所见,dog.properties 不再与 Animal.prototype.properties 相关联。是性能更好还是代码质量更好?

4

1 回答 1

0

好吧,在第一种情况下

var Animal = function(){
     this.properties = {};
     for(var key in Animal.prototype.properties)
         this.properties[key] = Animal.prototype.properties[key];
};
Animal.prototype.properties = {
     name: 'animal'
};

您正在遍历所有属性并一一分配它们,因此在 Animal.prototype.properties 中的属性越多,第二个属性就越多:

var AnimalV2 = function(){
     this.properties = Object.create(AnimalV2.prototype.properties);
};
AnimalV2.prototype.properties = {
     name: 'animalv2'
};

您正在创建一个新对象并将其 [[Prototype]] 属性分配给 AnimalV2.prototype.properties,因此无论 AnimalV2.prototype.properties 有多少属性,这只是一个分配。

TL; DR 所以看看性能和优雅,第二个是更好的方法。

对于干净的代码,我不喜欢其中的任何一个,我更喜欢始终在构造函数上拥有属性并保留方法的原型,这对于非 JavaScript 程序员来说很简单。(它也会更快)

AnimalV3 = function() {
    this.properties = {
       prop1: 'a',
       prop2: 'b'
    };
}
于 2012-10-04T21:15:50.780 回答