OOP使用来自闭包内部的新数据设置传入变量

OOP set a passed-in variable with new data from inside closure?

本文关键字:数据 设置 变量 新数据 自闭 闭包 内部 OOP      更新时间:2023-09-26

使用OOP时,您可以传递链接到对象/闭包外部的var的选项,但可以在对象/闭包内部设置?

var Object = function (element, options) {
    this.$element = $(element);
    this.options = {
        // option1
        place: {},         
    };
    // option2
    this.place;
    this.init();
};
Object.prototype = {
   set: function(newPlace){
       // option1
       this.options.place = newPlace;
       //option 2
       this.place = newPlace;
   }
}
$.fn.object = function (option) {
    if(option instanceof Object) {
        this._object = new Object(this, option);
        return this;
    }else if(option instanceof String){
       switch (option) {
           // option2
           case 'place': return this._object.place;
               break;
           default: return this;
        }
    }
};
$.fn.object.Constructor = Object;

--------进球-----------

var newPlace = null;
var newObject = new Object({ place : newPlace }); // or $('#').object({ place: newPlace });
newObject.set('test');
newPlace === 'test';  // <-- object should be able to set the value of external var.

我已经尝试了这两种方法,但都不返回闭包/对象内的新数据集。

我在上面把它们分别标记为option1和option2。

基本上,正如你所期望的var只是被覆盖,我也试着玩call/apply.

所以事实证明我可能一直在尝试做一些不正确的事情。

最好的方法和解决方案是在选项中传入一个函数回调来更新本地变量。

ExampleObject = function(options){
    options = {
       update: function(){}
    }
}
ExampleObject.prototype = { 
    set: function(newPlace){
        this.options.update(newPlace);
    }
}
newObject = ExampleObject({ update: function(r){ newPlace = r; } });

正常运行:

var obj = function (element, options) {
    this.$element = $(element);
    this.options = {
        // option1
        place: {},         
    };
    // option2
    this.place;
    //this.init();
};
obj.prototype = {
   set: function(newPlace){
       // option1
       this.options.place = newPlace;
       //option 2
       this.place = newPlace;
   }
}
var o = new obj();
console.log(o.options.place);
o.set('foo');
console.log(o.options.place);

或者如果你不需要多个实例:

var o = {
    options: {
        place: {}
    },
    setPlace: function(place){
        this.options.place = place;
    }
};
console.log(o.options.place);
o.setPlace('foo');
console.log(o.options.place);

function obj(o){
    this.o = o;
}
obj.prototype.set = function(newValue){
    this.o = newValue;
};
var o = new obj({t : 't'});
console.log(o.o);
o.set({ t2: 't2' });
console.log(o.o);