javascript 如何改变对象的属性
伊谢尔伦
伊谢尔伦 2017-04-11 12:45:57
[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,感觉我的变量都泄露了,我用闭包没有意义了。请问大家在写插件的时候是怎么进行处理的?

伊谢尔伦
伊谢尔伦

小伙看你根骨奇佳,潜力无限,来学PHP伐。

全部回复(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());

不过就算这样写,也可以通过更改对象的 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
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号