关于__defineGetter__ 和__defineSetter__的说明_应用技巧

本文介绍了JavaScript中的Getter和Setter方法的使用方法,并演示了如何在Mozilla浏览器中利用这些方法为对象添加新属性。同时,文章还提供了一个示例,展示了如何在Firefox浏览器中实现与IE相同的innerText属性。

源:http://anbutu.javaeye.com/blog/post/194276
关键字: JavaScript Mozilla __defineGetter__ __defineSetter__

说明:__defineGetter__ 和__defineSetter__方法只有在Mozilla浏览器中有效

 

Getter是一种获取一个属性的值的方法,Setter是一种设置一个属性的值的方法。可以为任何预定义的核心对象或用户自定义对象定义getter和setter方法,从而为现有的对象添加新的属性。
有两种方法来定义Getter或Setter方法:
在对象初始化时定义
在对象定义后通过Object的__defineGetter__、__defineSetter__方法来追加定义
在使用对象初始化过程来定义Getter和Setter方法时唯一要做的事情就是在getter方法前面加上“get”,在setter方法前面加上“set”。
还有一点要注意的就是getter方法没有参数,setter方法必须有一个参数,也就是要设置的属性的新值。
例如:
[复制此代码]CODE:
var Obj= {
value:9,
get b() {return this.value;},
set setter(x) {this.value = x;}
}

alert(Obj.value);//输出值为9
Obj.value=20;
alert(Obj.value);//输入值为20

在对象定义后给对象添加getter或setter方法要通过两个特殊的方法__defineGetter__和__defineSetter__。这两个函数要求第一个是getter或setter的名称,以string给出,第二个参数是作为getter或setter的函数。
例如我们给Date对象添加一个year属性:
[复制此代码]CODE:
Date.prototype.__defineGetter__('currentyear', function() {return this.getFullYear();});
Date.prototype.__defineSetter__('currentyear', function(y) {this.setFullYear(y)});
var now = new Date;
alert(now.currentyear);
now.currentyear= 2006;
alert(now);

至于采用哪种形式主要取决于个人的编程风格,采用第一种形式结构紧凑,更容易理解。但是假如你想在对象定义以后再添加Getter或Setter,或者这个对象的原型不是你写的或是内置对象,那么只好采用第二种方式了。

 

在IE和Opera下,DOM对象支持innerText属性,可以很方便的去除HTML标签。
但在Firefox不支持该属性,下面我们来实现FireFox下的innerText属性。

下面代码在IE和FireFox中都能运行正常

<html>
<head>
<script type="text/javascript">
if(document.implementation && document.implementation.createDocument)
{

//document.implementation && document.implementation.createDocument是作为鉴别Mozilla浏览器

//HTMLElement换成Element也可以
HTMLElement.prototype.__defineGetter__
(
"innerText",function()
//define a getter method to get the value of innerText,
//so you can read it now!
{
var textRange = this.ownerDocument.createRange();
//Using range to retrieve the content of the object
textRange.selectNodeContents(this);
//only get the content of the object node
return textRange.toString();
// give innerText the value of the node content
}
)
}


function test(){
alert(document.getElementById("test").innerText);
}
window.onload=test;//IE,FF下都能输出结果
</script>
</head>
<body>
<div id="test">tttttttttttttt</div>
</body>
</html>

<think>嗯,用户给了一个看起来像是JavaScript对象的结构,里面有code、count、data、msg这些属性,还有原型方法。用户问哪里可以看到数据。首先,我需要理解用户提供的这个对象的结构。 用户可能是在处理一个API响应,比如从后端获取的数据。这个对象里,code是1,通常表示成功;countdata都是null,而msg显示“新增公告栏成功!”。这说明这个响应可能是在执行新增操作后返回的,成功消息在msg里,但data字段为空,可能是因为操作不需要返回数据,或者数据还没填充。 接下来,用户想知道哪里能看到数据。可能用户期望在data字段里看到新增的公告栏数据,但现在data是null,所以困惑。需要检查几个方面:首先,确认API设计,是否在新增成功后确实会返回数据。有些POST操作可能只返回成功状态,不返回具体数据,尤其是新增后可能需要重新查询列表。其次,检查后端是否正确返回了data字段的数据,可能存在bug导致data未被正确填充。另外,用户可能在代码中没有正确处理响应,比如没有访问正确的属性。 然后,用户的代码中可能有问题。比如,如果用户用console.log打印了整个对象,但data为null,可能需要确认请求是否正确,或者是否有权限问题。或者,用户可能没有正确解析响应,比如在使用fetch时没有调用.json()方法,导致数据未正确解析。 还需要考虑用户的环境,比如使用浏览器开发者工具查看网络请求,检查响应体是否正确包含data。如果有的话,可能需要指导用户如何查看网络面板,找到对应的请求,查看响应内容。如果响应里确实没有data,那可能需要修改后端逻辑来返回所需数据。 总结,用户的问题可能出在API设计、后端返回的数据结构或前端代码处理响应的方式上。需要引导用户检查这些方面,并提供具体的调试步骤,比如使用控制台输出、检查网络请求等,来定位问题所在。</think>这个数据结构看起来是一个典型的JavaScript对象响应体。要查看数据,需要分以下几个步骤分析: 1. **数据结构解析**: ```javascript { code: 1, count: null, data: null, msg: "新增公告栏成功!" } ``` 2. **关键字段说明**: - `code: 1`:表示操作成功(通常约定非0为错误码) - `data: null`:实际数据字段(当前为空) - `msg`:操作结果描述 3. **查看数据的途径**: (1)**直接访问属性**: ```javascript console.log(response.data) // 当前返回null console.log(response.msg) // 输出"新增公告栏成功!" ``` (2)**常见问题分析**: - 如果期望在`data`中看到新增数据: ✓ 检查API文档,确认该接口是否设计为返回数据 ✓ 可能成功响应后需要单独调用查询接口获取数据 ✓ 确认后端是否确实返回了数据(通过浏览器开发者工具 > Network面板查看原始响应) 4. **调试建议**: ```javascript // 完整打印响应结构 console.log(JSON.stringify(response, null, 2)) // 检查网络请求 fetch('/api/announcement', { method: 'POST' }) .then(res => res.json()) .then(data => { console.log('Raw response:', data) // 查看原始响应 if(data.code === 1) { // 当data不为null时的处理 if(data.data) { console.log('Created data:', data.data) } // 当data为null时的处理 else { console.log('Success but no data returned') } } }) ``` 5. **可能的情况**: - 该接口为纯创建操作,遵循RESTful设计时: ✓ 可能返回201 Created状态码 ✓ 可能在响应头Location字段包含新资源地址 ✓ 需要后续调用GET接口获取完整数据 建议结合浏览器开发者工具的Network面板查看原始HTTP响应,确认是前端解析问题还是后端确实未返回数据。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值