对象的属性在改变时激活功能
Object's Property Activates Function When Changed?
我有一个对象,在本例中是法拉利。当使用ferrari.speed = 90;
改变速度时,假设我希望这个属性对改变做一些事情,例如使用函数改变屏幕上法拉利的速度。
我想知道最简单,最不疯狂的方法是什么?
这里有一个jsfiddle:
http://jsfiddle.net/qhV7B/3/
<button id="addspeed">speed up!!</button>
<button id="checkspeed">Check the speed!</button>
function car(){
speed: 0;
//Do something about speed change here? if its changed at all, greater or smaller?
}
document.getElementById('addspeed').onclick = function speedchange(){
ferrari.speed++;
}
document.getElementById('checkspeed').onclick = function checkspeed() {
alert(ferrari.speed);
}
var ferrari = new car();
ferrari.speed = 10;
Set operator
就是你要找的https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/set
这是我的解决方案http://jsfiddle.net/qhV7B/6/。
function car(){
}
car.prototype = {
hidden_speed: 0,
set speed(v){
//special action
alert("I changed value to " + v);
this.hidden_speed = v;
},
get speed(v){
return this.hidden_speed;
},
};
var ferrari = new car();
ferrari.speed = 10;
document.getElementById('addspeed').onclick = function speedchange(){
ferrari.speed = (ferrari.speed + 1);
}
document.getElementById('checkspeed').onclick = function checkspeed() {
alert(ferrari.speed);
}
可以通过getter和setter来实现,一种方法是通过Object.defineProperty():
function car(){
this._speed=0;
}
...
var ferrari = new car();
Object.defineProperty(car.prototype,"speed",{
get:function(){return this._speed;},
set:function(v){
this._speed=v;
document.getElementById("speed").textContent=v.toString(10);
}
});
ferrari.speed = 10;
修改的小提琴小提琴。
其他关于getter和setter的文档,可能过时,也可能不过时,或者依赖于平台:
- https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Working_with_Objects Defining_getters_and_setters
- https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/get
- https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/set
- https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/defineGetter
- https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/defineSetter
* edit: change parameter of Object.defineProperty
from ferrari
to car.prototype
此代码使用setSpeed
方法,允许您在速度变化时添加任何其他所需的逻辑:
var Car, ferrari,
__bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; };
Car = (function() {
function Car() {
this.setSpeed = __bind(this.setSpeed, this);
}
Car.prototype.speed = 0;
Car.prototype.setSpeed = function(newSpeed) {
this.speed = newSpeed;
//Here is where you custom logic needs to run
return alert("Speed Changed to: " + this.speed);
};
return Car;
})();
ferrari = new Car();
ferrari.setSpeed(10);
document.getElementById('addspeed').onclick = function speedchange(){
ferrari.setSpeed(ferrari.speed+1);
}
document.getElementById('checkspeed').onclick = function checkspeed() {
alert(ferrari.speed);
}
Javascript在这里生成
使用律师在评论中的建议,你可以创建一个speedUp函数,它可以触发你的动画函数的变化(或speedChange,如果你想能够慢下来,无论你的船漂浮)。
查看小提琴:http://jsfiddle.net/86HtX/
我还对你的代码做了一些调整:
function car(){
var car = this;
this.speed = 0;
this.speedUp = function(mph){
car.speed += mph;
car.animate();
};
this.animate = function(){
alert(car.speed); // new speed
};
//Do something about speed change here? if its changed at all, greater or smaller?
}
document.getElementById('addspeed').onclick = function speedchange(){
ferrari.speedUp(1); // go 1 mph faster
}
document.getElementById('checkspeed').onclick = function checkspeed() {
alert(ferrari.speed);
}
var ferrari = new car();
ferrari.speed = 10;
相关文章:
- JS不工作:Sublime 3编辑器-Var main=函数()-=不是“”;激活“;(功能新手)
- 如何在iframe中激活jquery功能
- 重复jquery点击激活的动画功能
- 通过自定义JS功能激活Sencha Touch选项卡
- 选中复选框时如何激活功能
- 父路由器激活功能在每次导航到其子路由时运行
- 如何隐藏搜索结果框,我希望它们在点击并激活键控功能时显示
- 滚动功能在滚动前激活
- 如果功能多次激活,请多次停止输出打印
- 花式树激活节点启动功能
- 点击DIV或A标签激活JS功能
- 开关不激活功能
- 激活单击上一个按钮后创建的按钮上的单击功能
- 未激活的功能如何影响网站
- 单击Rails后激活Javascript功能form_for选择字段
- 如何仅在单击专用按钮时激活功能
- 如何在单击选项卡时激活功能
- 对象的属性在改变时激活功能
- 如何在用户关闭浏览器/选项卡之前激活功能
- 在while循环中激活功能时出现故障