属于实例的对象是否应与原型保持链接?

时间:2012-09-20 09:37:49

标签: javascript prototype

有什么好处?

此实施

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'
};

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

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没有关联。在性能或代码质量方面是否更好?

1 个答案:

答案 0 :(得分: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'
    };
}