prototype对象的一个问题,一百分送上

guosheng1987 2010-08-17 04:27:03
var Animal = function (){
}

var property;
Animal.prototype.name='jason';
for( property in Animal.prototype ){
alert(property);
}

为什么property只弹出了jason。
Animal.prototype 内置的constructor属性为什么弹不出来。

用alert(Animal.prototype.constructor)
却可以看到。
...全文
151 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
rainsilence 2010-08-17
  • 打赏
  • 举报
回复
其实,他有一个特殊的说法,叫用户声明属性比如window对象,系统对象,用户自定义对象都属于这个范围。
还有一类叫系统属性,比如prototype.constructor,这类属性不可以被delete关键字删除。
rainsilence 2010-08-17
  • 打赏
  • 举报
回复
var arr = new Array();
for (var prop in arr) {
alert(prop);
}

Array中属性也是预定义属性吧。
kaifadi 2010-08-17
  • 打赏
  • 举报
回复
都是OO高人,我来拜北,学习了!
guosheng1987 2010-08-17
  • 打赏
  • 举报
回复
propertyIsEnumerable 属性

说明
如果 proName 存在于 object 中且可以使用一个 For…In 循环穷举出来,那么 propertyIsEnumerable 属性返回 true。如果 object 不具有所指定的属性或者所指定的属性不是可列举的,那么 propertyIsEnumerable 属性返回 false。典型地,预定义的属性不是可列举的,而用户定义的属性总是可列举的。
js手册上的,这里可能解释了为什么constructor不能被枚举出来
cjcgy 2010-08-17
  • 打赏
  • 举报
回复

(function(){
var Animal = function(){
};
Animal.prototype.inProtoType = {
name: "inPrototype"
};

var aInstanceOfAnimal = new Animal();
aInstanceOfAnimal.notInPropertyType = {
name: "notInPropertyType"
};
for (name in aInstanceOfAnimal) {
document.write("name:"+name);
document.write("<br />");
if (aInstanceOfAnimal[name]) {
document.write("value:")
document.write(aInstanceOfAnimal[name]["name"]);
document.write("<br />")
}
if (aInstanceOfAnimal.hasOwnProperty(name)) {
document.write("can be get by hasOwnProperty");
document.write("<br />");
}
else {
document.write("can not be get by hasOwnProperty");
document.write("<br />");
}
}
}())


这段示例代码演示了属性在原型链的过程中, for in可以检索, 而hasOwnProperty不能检索出来。

lz你这样做其实没有用到原型链, 因为你一直在操作prototype对象, 没有去操作Animal对象。

所以不涉及任何原型链的问题。
只是简单的赋值, 取值。

shenzhenNBA 2010-08-17
  • 打赏
  • 举报
回复
我的是MS IE 6.0 , FF 也是这样
shenzhenNBA 2010-08-17
  • 打赏
  • 举报
回复
嘿嘿,实验结果是这样
var Animal = function (){
}

var property;
Animal.prototype.name='jason'; //通过prototype产生属性
Animal.prototype.fun01=function(){alert("function 01");}; ////通过prototype产生函数
for( property in Animal.prototype ){
alert(property);
}

显示name,fun01,但不显示Animal的原型定义
imaf 2010-08-17
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 cjcgy 的回复:]

一楼的,
虽然我也不知道为什么constructor不会被枚举出来,

for in绝对是要看原型链的。
hasOwnProperty不看原型链。

不要误导别人。
[/Quote]

但是我试的怎么没有出来呢。
cjcgy 2010-08-17
  • 打赏
  • 举报
回复
一楼的,
虽然我也不知道为什么constructor不会被枚举出来,

for in绝对是要看原型链的。
hasOwnProperty不看原型链。

不要误导别人。
imaf 2010-08-17
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 guosheng1987 的回复:]

还有 除了constructor之外,还有没有不能被枚举的属性?
[/Quote]

貌似只要不是自己的都不会被for in枚举出来。
imaf 2010-08-17
  • 打赏
  • 举报
回复
name是被添加到原型链了,所以不会被枚举出来呢。

假如是这么写

window.onload = function () {

var animal = new Object();

animal.name = '超人';

for (var p in animal) {
alert(p + ' = ' + animal[p]); // 这里只会枚举出name属性,而不含Object当中的属性。
}
}
guosheng1987 2010-08-17
  • 打赏
  • 举报
回复
还有 除了constructor之外,还有没有不能被枚举的属性?
guosheng1987 2010-08-17
  • 打赏
  • 举报
回复
不好意思楼上的 还是有点不明白

for in 枚举对象的属性不包括原型链当中的属性。


name为什么不算原型链当中的属性

name已经被添加到了原型链之中啊
shenzhenNBA 2010-08-17
  • 打赏
  • 举报
回复
简单可以这样理解,用prototype给原型(增加)产生的属性或函数都可以显示出来,不包括Animal的定义,如:
var Animal = function (){
}

var property;
Animal.prototype.name='jason'; //通过prototype产生属性
Animal.prototype.fun01=function(){alert("function 01");}; ////通过prototype产生函数

for( property in Animal.prototype ){
alert(property);
}

可以显示jason,fun01,但不显示Animal的原型定义
imaf 2010-08-17
  • 打赏
  • 举报
回复
for in 枚举对象的属性不包括原型链当中的属性。

可用对象的 hasOwnProperty()来测试对象是否具有某属性。

propertyIsEnumerable()来测试此属性是否可被枚举。

87,915

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 JavaScript
社区管理员
  • JavaScript
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧