第一组:杨昊 在Radio选中后改变Radio的样式
比如这样的:
苹果
香蕉
葡萄
以上三个单选框,第一个是默认选中的,问题:如何让选中的radio给
添加样式?比如,我选中香蕉,香蕉那行的
就加个 class="cur"。就变成了这样:
香蕉
还有就是只要被选中的就给加class="cur"。
那么解决方案是:JQuery!!!
是贼好用!!!
不多说看代码:
$(function(){
$(".box input").change(function(){
$(":checked").parent().addClass("cur").siblings().removeClass("cur");
});
});
PS:siblings()用于在单选框属性为checked时,遍历整个单选Box,将之前选中的radio样式给移除掉。
第二组:叶佳意 JSON中的[] 与 {}
在 JSON 里 [] 是 Array(也就是数组) ,{} 是Ojbect(也就是对象)。[] Array 的key 是 int;{} 的key 是 string。
例如:var dot1=["a"]; 就是一个数组
var dot2={"a"} 就是一个对象
数组和对象转换非常简单, dot1把[] 替换为{} 就是对象, dot2把[]替换为{}就是素组。这在jquery的JSON处理中,非常常用。
当dot1为数组后,自然支持数组的常用方法,例如 dot1.push(), dot1.shift(),dot1.pop() 等方法。dot2为对象可以使用JS对象的各种方法。
var dot2={a:"a",b:"b",c:"c"}; 不管你看到dot2定义多么复杂,只要看到他是以{}开始和结尾就是理解为对象。var dot1=["a","b","c"]; 不管dot1多简单,只要是[]包含,就是数组。
当然,一个数组是可以包含多个对象的,所以 var dot1=[{a:"a"},{b:"b"}]; dot1就包含了2个对象。同样,dot1={[{a:"a"},{b:"b"}]} 就是一个对象,只是这个对象包含了一个数组。
var a= Array();
a[a.length] = '3';
a[a.length] = '4';
a[a.length] = '5';
a toJSON 后 ='["3", "4", "5"]'
var a = new Object();
a['test1'] = '3';
a['test2'] = '4';
a['test3'] = '5';
a toJSON 后 = '{"test1":"3", "test2":"4", "test3":"5"}'
第三组: javascript Object 冻结
Object 提供了三种方法对对象属性进行不同程度的冻结:
Object.preventExtensions(obj) : 无法对对象增加新属性
Object.seal(obj) : 无法对对象进行删除操作
Object.freeze(obj) : 冻结(浅层),除了上面两种外,对浅层的对象属性无法更改:
ar obj = {
name: 'dora',
sub: {
qq: '443322222',
result: {
ok1: 'good',
ok2: 'success'
}
}
}
Object.freeze(obj); // 冻结(浅层)
delete obj.name;
obj.type = 'js';
obj.name = 'dora1';
obj.sub.qq = 'what salei';
obj.sub.result.ok1 = 'really ok?';
console.log(obj);
输出:
{ name: 'dora',
sub:
{ qq: 'what salei',
result: { ok1: 'really ok?', ok2: 'success' } } }
我们发现 name 属性改变不了,但是 sub 属性的自属性 qq,result.ok1改变了。如何实现对象是深层冻结呢?
function deepFreeze(obj) {
let getSubObj = (subObj) => {
Object.freeze(subObj);
for (let prop in subObj) {
if (typeof subObj[prop] === 'object') {
Object.freeze(subObj[prop]);
getSubObj(subObj[prop]);
} else {
continue;
}
}
}
getSubObj(obj);
}
执行
deepFreeze(obj)
输出
{ name: 'dora',
sub: { qq: '443322222', result: { ok1: 'good', ok2: 'success' } } }
对象属性完全冻结
第四组:李俊 GridControl根据条件设置每行中某单元格只读
要实现该功能,需要在GridControl下GridView的CustomRowCellEdit事件里处理。
具体代码如下:
//表示GridControl中需要设置属性的控件
RepositoryItem _disabledItem;
private void _gridView_CustomRowCellEdit(object sender, DevExpress.XtraGrid.Views.Grid.CustomRowCellEditEventArgs e)
{
if (e.Column.Name != "colunmName")//需要设置的列名
return;
if (_disabledItem == null)
{
_disabledItem = (RepositoryItem)e.RepositoryItem.Clone();
_disabledItem.ReadOnly = true;
_disabledItem.Enabled = false;
}
//判断条件
var electric = _gridView.GetRow(e.RowHandle) as SelectElectricShow;
if (electric == null)
return;
//满足条件,设置成只读
if (electric.IsLimited)
e.RepositoryItem = _disabledItem;
}
效果如图所示:
第五组:周倩宇 C++ new、堆上和栈上分配对象
1. 说明
new:(1) 一种运算符(malloc是一种c中的库函数)
(2) 先分配对象(operator new)再构造对象,一般用于满足自定义的类类型
2. 原型
原型: void * operator new(size_t) throw(bad_alloc)
解释:该函数的返回值是一个void*指针,同时有可能会抛出bad_alloc的异常
3. 分析
分析new,且看vs2010中默认的全局operator new如下:
void *__CRTDECL operator new(size_t size) _THROW1(_STD bad_alloc)
{ // try to allocate size bytes
void *p;
while ((p = malloc(size)) == 0)
if (_callnewh(size) == 0) //调用new_handler
{ // report no memory
static const std::bad_alloc nomem;
_RAISE(nomem); //抛出异常
}
return (p);
}
解释:
(1)函数框架与原型2一致
(2)3大步如下:
首先调用库函数malloc函数分配内存,若分配成功则直接返回;
其次,若分配失败则malloc返回0,此时调用new分配失败的处理函数new_handler(可以自己设置),然后反复malloc直到成功
最后,若调用new_handler后仍然无法分配足够的内存,则抛出bad_alloc异常
在operator new运行成功后,需要对对象进行构造,可以根据类类型以及给定的参数进行构造对象。
4. placement new可在已经分配的内存上进行构造对象
new (已分配的地址) type
new (已分配的地址) type(参数)
5. 仅在堆上才能创建的对象
利用栈变量在生命周期结束时由编译器自动释放的特点,即在生命周期结束时由编译器自动调用析构函数,
通过将析构函数定义为private或者protected,使得编译器无法调用,从而编译不通过。
(1)初始如下
使用方法:
heapObject* hp = new heapObject;
hp->release();
缺点:不易用,使用new创建,但需要函数来释放,且作为基类继承后无法访问private的析构函数
(2)修改如下
class heapObject
{
public:
heapObject() {}
void release()
{
delete this;
}
private:
~heapObject(){}
};
使用:
heapObject* hp = heapObject::create();
hp->release();
- 仅能在栈上分配的对象
class stackObject
{
private:
void* operator new( size_t );
void operator delete( void* );
void* operator new[](size_t);
void operator delete[](void*);
};