javascript 如何改变对象的属性

比如我的原型中有这样一个属性this.removeFlag=true;
//原型创建

;(function(){
    function Swin(){
    this.removeFlag=true;//该标志为可移动标志
    }
    window['Swin']=Swin;
})()

//创建对象
var win=new Swin()//这样创建,win对象的removeFlag属性是true,实际上我希望这个对象是不可移动的,所以想针对这个对象把win的removeFlag 设成false,但是这样写:win.removeFlag=false,感觉我的变量都泄露了,我用闭包没有意义了。请问大家在写插件的时候是怎么进行处理的?

阅读 4.2k
5 个回答

JavaScript 很灵活也很开放,你想要的效果有可能不能完善实现,通过构造函数,可以进行一个简单的闭包封装。这里是否允许移动通过一个参数传递给构造函数。

var Swin = (function() {
    function Swin(movable) {
        this.isMovable = function() {
            return movable;
        };
    }

    // 通过 Swin.prototype 设置其它原型
    
    return Swin;
})();

var s1 = new Swin(true);
var s2 = new Swin(false);

console.log("s1", s1.isMovable(), ": s2", s2.isMovable());

clipboard.png

不过就算这样写,也可以通过更改对象的 isMovable 来改变行为:比如

s1.isMovable = function() { return false; }

顺便:你问题中提到的是“移动”,但你代码里却是用的 remove(删除),反正我有点晕

首先修改原型中的变量很危险,会影响到其他的实例。如果必须,那就直接修改原型对象上的属性,而不要用this属性去覆盖。

我感觉你可能需要一个静态属性就可以了

function Foo() {
  this.t = false;
}

Foo.prototype.modify = function () {
  this.t = true;
}

var foo = new Foo();
console.log(foo.t); // false
foo.modify();
console.log(foo.t); // true

不知道你是不是这个意思,? ,我认为吧,提问也是一项技能,应该尽量把问题描述清楚。

;(function(){
    function Swin(){
        this.removeFlag=true;
    }
    var swin = new Swin();
    function setRemoveFlag(_value){
        swin.removeFlag=_value
    }
    window._app = swin;
    window['setRemoveFlag']=setRemoveFlag
})();
//window._app;
//window['setRemoveFlag'](false);
//window._app;
;(function(){
    function Swin(){}
    Swin.prototype={
        constructor:Swin,
        removeFlag:false,//默认不可移动
        setRemoveFlag:function(removeFlag){
            this.removeFlag=removeFlag;
        },
        getRemoveFlag:function(){
            return this.removeFlag;
        }
        
        
    }
    window['Swin']=Swin;
})();

var swin=new Swin();
console.log(swin.removeFlag);//false
swin.removeFlag=true;//只是为当前swin实例对象添加了属性removeFlag,不影响prototype中的值
console.log(swin.__proto__.getRemoveFlag());//false
console.log(swin.getRemoveFlag());//true 获取swin实例对象上的属性removeFlag的值
swin.setRemoveFlag(false);//更新swin实例对象上的属性removeFlag的值
console.log(swin.getRemoveFlag());//false 获取swin实例对象上的属性removeFlag的值
swin.removeFlag=true;
console.log(swin.getRemoveFlag());//true 获取swin实例对象上的属性removeFlag的值
console.log(swin.__proto__.getRemoveFlag());//false
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题