gpt4 book ai didi

javascript - jQuery 扩展复制之前的闭包

转载 作者:行者123 更新时间:2023-12-03 07:19:04 24 4
gpt4 key购买 nike

描述

在我的示例中,我尝试定义一个带有 private 成员和 public getter 的简单类(称为 Car)。我还有另一个对象,我想将其映射到我的类的实例中。我正在使用 jQuery.extend() 来实现此目的,并且它运行良好,除非该成员是私有(private)的(与此无关)。我猜测这是因为 getter 函数已经关闭了对象创建时定义的值。

我仍然希望能够在 .extend() 之后重新关闭该成员的函数,以便它将反射(reflect)新值,任何人都可以帮助我实现这一目标吗?

我还尝试扩展传入的对 {} 对象的引用,然后使用该空白对象作为目标,如下所示:

function mapToObject(template, json) {
var b = $.extend(true,{}, template);
return $.extend(true, b, json);
}

这也没有打破之前的封闭。

我的代码:

// simple class with private member
function Car() {
var noOfWheels = 2;
this.honk = function() {
alert(noOfWheels);
}
}
// method which converts JSON object to a more typed class object
function mapToObject(template, json) {
return $.extend(true, template, json);
}

// sample Object , in reality coming from AJAX response
var t = {
noOfWheels: 5
};
// i want to map t to an instance of Car
var r = mapToObject(new Car, t);// closing here during new Car, i think
r.honk(); // this alerts 2 not 5 because of closure!

fiddle :

https://jsfiddle.net/sajjansarkar/samj3pjq/2/

[编辑]我的解决方案基于 DrFlink 的答案:

// one class
function Car(options) {
var settings = $.extend({
noOfWheels: 2
}, options || {});
this.honk = function() {
alert(settings.noOfWheels);
}
}
// another class
function Lemon(options) {
var settings = $.extend({
color: null
}, options || {});
this.getColor = function() {
alert(settings.color);
}
}
// function to map any json to a template class instance
function ObjectMapperFactory(template, json) {
if (!jQuery.isArray(json)) {
return new template(json);
} else {
var returnArray = [];
$(json).each(function() {
returnArray.push(new template(this))
});
return returnArray;
}
}

//test 1
var carJSON = {
noOfWheels: 5
};
var c = ObjectMapperFactory(Car, carJSON);
c.honk();
//test2 -different class and also testing array
var lemonJSON = [{
color: "yeller"
},{
color: "red"
}];

var c = ObjectMapperFactory(Lemon, lemonJSON);
c[0].getColor();
c[1].getColor();

更新的 fiddle :

https://jsfiddle.net/sajjansarkar/samj3pjq/3/

最佳答案

你为什么要这样做?也许这会更简单:

// simple class with private member
var Car = function(options) {
var settings = $.extend({
noOfWheels: 2
}, options || {});

// Public method - can be called from client code
this.honk = function(){
alert(settings.noOfWheels);
};

// Private method - can only be called from within this object
var myPrivateMethod = function(){
alert('This is private!');
};
};

// sample Object
var t = {
noOfWheels: 4
};

var I = new Car(t);
var J = new Car({
noOfWheels: 6
});

I.honk();
J.honk();

关于javascript - jQuery 扩展复制之前的闭包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36285651/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com