【问题标题】:Javascript behaviour reuse: What side effects will this approach have?Javascript 行为重用:这种方法会有什么副作用?
【发布时间】:2012-02-25 16:33:06
【问题描述】:

我正在尝试理解纯基于原型的 JavaScript,而我正在努力解决的一个具体问题是重用(继承)。

在我的项目中,我采用了这种创建可重复使用对象的方式。

// very generic prototype
var Apparatus = (function(){
    var self = Object.create({});
    self.state = false;
    self.on = function() { this.state = true; };
    return self;
})();

// more specific prototype
var Radio = (function(){
    var self = Object.create(Apparatus);
    self.frequency = 0;
    self.setFrequency = function(f) { this.frequency = f; }
    self.getFrequency = function() { return this.frequency; } 
    return self;
})();

然后我想“实例化”/复制 Radio 对象,创建两个不同的收音机。

var kitchenRadio = Object.create(Radio);
kitchenRadio.state = false;
kitchenRadio.on();

var carRadio = Object.create(Radio);
carRadio.state = false;

console.log(kitchenRadio.state, carRadio.state);
// true false

这行得通,但它会继续吗?任何人都可以预测任何不想要的结果吗?

【问题讨论】:

  • 我不确定这是否不需要,但Radio.on() 会将kitchenRadio.state 设置为true
  • 所以我必须在 kitchenRadio 和 carRadio 中专门创建状态属性以避免这种情况。我可以在不广泛改变方法的情况下解决这个问题吗?
  • 我想重点是应该继承函数,而不是state等属性。所有无线电都以共同的方式打开,但每个无线电都有自己的状态。因此,每个最终实例都有自己的属性,而函数是继承的。

标签: javascript inheritance prototype-oriented


【解决方案1】:

就像@pimvdb 所说,删除状态,这很好用。

// very generic prototype
var Apparatus = (function(){
    var self = Object.create({});
    self.on = function() { this.state = true; };
    return self;
})();

// more specific prototype
var Radio = (function(){
    var self = Object.create(Apparatus);
    self.setFrequency = function(f) { this.frequency = f; }
    self.getFrequency = function() { return this.frequency; } 
    return self;
})();

然后我使用Object.create(Object, params) 来实例化它。

【讨论】:

    猜你喜欢
    • 2010-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多