Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/416.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript行为重用:这种方法会有什么副作用?_Javascript_Inheritance_Prototype Oriented - Fatal编程技术网

Javascript行为重用:这种方法会有什么副作用?

Javascript行为重用:这种方法会有什么副作用?,javascript,inheritance,prototype-oriented,Javascript,Inheritance,Prototype Oriented,我试图理解纯粹的基于原型的JavaScript,我正在努力解决的一个具体问题是重用(继承) 对于我的项目,我用这种方法创建了可以重用的对象 // very generic prototype var Apparatus = (function(){ var self = Object.create({}); self.state = false; self.on = function() { this.state = true; }; return self; }

我试图理解纯粹的基于原型的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对象,创建两个不同的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

这是可行的,但它会继续吗?有人能预测出任何不想要的结果吗?

就像@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)
来实例化它

我不确定这是否是不需要的,但是
Radio.on()
会将
kitchenRadio.state
设置为
true
。因此我必须在kitchenRadio和carRadio中专门创建state属性以避免这种情况。我能在不广泛改变方法的情况下解决这个问题吗?我想关键是函数应该被继承,而不是像
state
这样的属性。所有收音机都以通用方式打开,但每个收音机都有自己的状态。因此,每个最终实例都有自己的属性,而函数是继承的。