如何打印一个php 打印对象的属性所有属性

ios开发中类方法与self的注意点 与实例方法区别
Objective-C里面既有实例方法也类方法。类方法(Class Method) 有时被称为工厂方法(Factory Method)或者方便方法(Convenience method)。工厂方法的称谓明显和一般意义上的工厂方法不同,从本质上来说,类方法可以独立于对象而执行,所以在其他的语言里面类方法有的时候被称为静态方法。
注意点一:类方法
1,类方法可以调用类方法。
2,类方法不可以调用实例方法,但是类方法可以通过创建对象来访问实例方法。
3,类方法不可以使用实例变量。类方法可以使用self,因为self不是实例变量。
4,类方法作为消息,可以被发送到类或者对象里面去(实际上,就是可以通过类或者对象调用类方法的意思)。
注意点二:self的规则
大家需要记住下面的规则:
1,实例方法里面的self,是对象的首地址。
2,类方法里面的self,是Class.
尽管在同一个类里面的使用self,但是self却有着不同的解读。在类方法里面的self,可以翻译成class self;在实例方法里面的self,应该被翻译成为object self。在类方法里面的self和实例方法里面的self有着本质上的不同,尽管他们的名字都叫self。
类方法创造的对象要不要用release释放?
答 不需要 这个对象被放到自动释放池中
Object-C中的私有方法和私有成员变量
成员变量默认对内是共有的,对外是私有的。
@interface Controller : NSObject
@private:
NSString *
+ (void)thisIsAStaticM
- (void)thisIsAnInstanceM
@interface Controller (Private)
- (void)thisIsAPrivateM
下面的代码就是怎样获取私有变量(记得加头文件#import ):
NSString *
Mobj *obj = [[Mobj alloc] init];
object_getInstanceVariable(obj, "mt_", (void *)&str);
NSLog(@"%@",str);
[obj release];
//===================================
实例方法和类方法的区别
类方法和实例方法
1:实例方法是― 类开头是+ 实例方法是用实例对象访问,类方法的对象是类而不是实例,通常创建对象或者工具类。
在实例方法里,根据继承原理发送消息给self和super其实都是发送给self
在类方法里面self是其他的类的类方法,在类方法中给self发送消息只能发类方法self是类super也是
什么时候用类方法,要创建一个实例时候获取一个共享实例,或者获取关于类的一些共有信息
类方法(class method)和实例方法(instance method)。类方法被限定在类范围内,不能被类的实例调用(即脱离实例运行)。alloc就是一种类方法。实例方法限定在对象实例的范围内(即实例化之前不能运行)。init就是一种实例方法,被alloc方法返回的对象实例调用。
NSObject *
object1 = [[NSObject alloc]
instance method
以减号 "-"
class method
以加号 “+” 开头,相当于static方法
3:see see 更健康
Objective-C
1.OC是一门基于C的面向对象语言,是C语言的一个超集,同时具有C语言的特征
2.OC对类的定义和实现以及初始化
//声明类接口,继承NSObject对象(该对象是OC中所有类的顶级父类,所有类都继承于它)
@interface ClassName :NSObject
//成员属性和成员函数的声明
+(void)function;//类方法,不需要实例化对象就可以调用的方法
- (void)function2 :(NSString *)arg;//成员方法,必须通过实例化的对象调用
@imlementation ClassName
//成员属性初始化和方法的定义
对象的初始化:ClassName *obj = [[ClassName alloc] init]
OC中以消息机制传递信息,发送alloc消息给类分配内存空间,发送init消息生成对象,指针指向对象本身。
3.类方法的调用
[obj function];
NSString *str = [NSString stringWithString:@"hello"];
[obj function2 : str];
4.输出函数
根据不同的输出格式输出不同的值 (%d :整形 ,%@:对象,%s:字符串)
NSlog(@“The result is %d”,intNum);
CF代表Core Foundation (Cocoa)
CFShow发送description给它显示的对象,CFShow打印的信息不会显示时间戳,NSLog会显示,同时CFShow不需要格式字符
串,它只能用于对象
CFShow(obj);
支持点表示法:myTableViewCell.textLabel.text = @"hello" 等价于 [[myTableViewCell textLabel] setText:@"hello"];
使用属性生成器 property
在h文件中声明: @property int year
在m文件中合成生成器:@synthesize year
使用 obj.year = 1999 相当于调用了 [obj setYear:1999];
可以自定义取值方法和赋值方法(getter and setter)
-(int)year
- (void) setYear : (int) newYear
//此处添加了一些基本的内存管理方法,保留新的值,释放以前的值
if(newYear != year)
[year release];
year = [newYear retain];
也可以绕过oc的命名约定,自己指定getter和setter方法的名称;
@property(getter = isExist,setter = setExist:) BOOL
使用过程中既可以使用新定义的方法名,也可以使用以前的方法(点表示法)
属性的特性:readwrite readonly assign retain copy nonatomic
assign:默认行为,使用@property int year就使用了assign行为,就是给实例变量赋了一个值
retain:实现了两个功能,一个是保留了赋值时传递的对象,其次是赋值前释放了以前值,使用retain可以实现上面讨论的内存管理的优点,使用时加上 @property (retain)int year;
copy:发送一条复制的消息给被传递的对象,保留它,并释放任何以前的值;
nonactomic:非原子访问器,加上后可以提升访问速度,但当两个线程同时修改同一个属性时就会出现问题,原子属性可以保证属性在被一个线程使用时不被另一个线程访问,不存在atomic关键字,默认情况下,所有方法都是自动合成的。(类似与java中的线程锁机制synchronized)
readwrite:可读写
readonly:只读js-window对象的方法和属性资料_前端开发 - 网奇公司
网奇&|&&|&
js-window对象的方法和属性资料
Window对象是客户端javascript最高层对象之一,只要打开浏览器窗口,不管该窗口中是否有打开的网页,当遇到BODY、FRAMESET或FRAME元素时,都会自动建立window对象的实例。另外,该对象的实例也可由window.open()方法创建。由于window对象是其它大部分对象的共同祖先,在调用window对象的方法和属性时,可以省略window对象的引用。例如:window.document.write()可以简写成: document.write()。  在窗口中觖发本窗口对象的任何方法和属性时可以省去窗口的实例名称。例如给当前的myWin窗口设置status属性时,可以只用status而不用myWin.status。但是,在事件处理中调用location属性、close()方法或open()方法时必须使用实例名称。
window对象有以下方法:
open close alert confirm prompt setTimeout clearTimeout setInterval clearInterval moveBy moveTo resizeBy resizeTo scrollBy scrollTo find back forward home stop print blur focus captureEvent enableExternalCapture disableExternalCapture handleEvent releaseEvent routeEvent scroll
  1. open方法   语法格式:
window.open(URL,窗口名称,窗口风格)   功能:打开一个新的窗口,并在窗口中装载指定URL地址的网页。
  说明:
open方法用于打开一个新的浏览器窗口,并在新窗口中装入一个指定的URL地址;open方法在打开一个新的浏览器窗口时,还可以指定窗口的名称(第二个参数); open方法在打开一个新的浏览器窗口时,还可以指定窗口的风格(第三个参数),
窗口风格有以下选项,这些选项可以多选,如果多选,各选项之间用逗号分隔: toolbar:指定窗口是否有标准工具栏。当该选项的值为1或yes时,表示有标准工具栏,当该选项的值为0或no时,表示没有标准工具栏; location:指定窗口是否有地址工具栏,选项的值及含义与toolbar相同; directories:指定窗口是否有链接工具栏,选项的值及含义与toolbar相同; status:指定窗口是否有状态栏,选项的值及含义与toolbar相同; menubar:指定窗口是否有菜单,选项的值及含义与toolbar相同; scrollbar:指定当前窗口文档大于窗口时是否有滚动条,选项的值及含义与toolbar相同; resizable:指定窗口是否可改变大小,选项的值及含义与toolbar相同; width:以像素为单位指定窗口的宽度,已被innerWidth取代; height:以像素为单位指定窗口的高度,已被innerHeight取代; outerWidth:以像素为单位指定窗口的外部宽度; outerHeight:以像素为单位指定窗口的外部高度; left:以像素为单位指定窗口距屏幕左边的位置; top:以像素为单位指定窗口距屏幕顶端的位置; alwaysLowered:指定窗口隐藏在所有窗口之后,选项的值及含义与toolbar相同; alwaysRaised:指定窗口浮在所有窗口之上,选项的值及含义与toolbar相同;dependent:指定打开的窗口为当前窗口的一个子窗口,并随着父窗口的关闭而关闭,选项的值及含义与toolbar相同;hotkeys:在没有菜单栏的新窗口中设置安全退出的热键,选项的值及含义与toolbar相同; innerHeight:设定窗口中文档的像素高度;innerWidth:设定窗口中文档的像素宽度;screenX:设定窗口距离屏幕左边界的像素长度;screenY:设定窗口距离屏幕上边界的像素长度;titleBar:指明标题栏是否在新窗口中可见,选项的值及含义与toolbar相同;z-look:指明当窗口被激活时,不能浮在其它窗口之上,选项的值及含义与toolbar相同。
open方法返回的是该窗口的引用。
小技巧:该方法经常用于在打开一个网页时自动打开另一个窗口。
2. close方法 语法格式:
window.close() 功能:close方法用于自动关闭浏览器窗口。
3. alert方法 语法格式:
window.alert(提示字符串) 功能:弹出一个警告框,在警告框内显示提示字符串文本。
4. confirm方法 语法格式:
window.confirm(提示字符串) 功能:显示一个确认框,在确认框内显示提示字符串,当用户单击&确定&按钮
时该方法返回true,单击&取消&时返回false。
5. prompt方法 语法格式:
window.prompt(提示字符串,缺省文本) 功能:显示一个输入框,在输入框内显示提示字符串,在输入文本框显示缺省文
本,并等待用户输入,当用户单击&确定&按钮时,返回用户输入的字符串,当
单击&取消&按钮时,返回null值。
6. setTimeout方法 语法格式:
window.setTimeout(代码字符表达式,毫秒数) 功能:定时设置,当到了指定的毫秒数后,自动执行代码字符表达式。
7. clearTimeout方法 语法格式:
window.clearTimeout(定时器) 功能:取消以前的定时设置,其中的参数是用setTimeout设置时的返回值。
8. setInterval方法 语法格式:
window.setInterval(代码字符表达式,毫秒数) 功能:设定一个时间间隔后(第二个参数),反复执行&代码字符表达式&的内容
9. clearInterval方法 语法格式:
window.clearInterval(时间间隔器) 功能:取消setInterval设置的定时。其中的参数是setInterval方法的返回值。
10. moveBy方法 语法格式:
window.moveBy(水平位移量,垂直位移量) 功能:按照给定像素参数移动指定窗口。第一个参数是窗口水平移动的像素,第
二个参数是窗口垂直移动的像素。
11.moveTo方法 语法格式:
window.moveTo(x,y) 功能:将窗口移动到指定的指定坐标(x,y)处。
12. resizeBy方法 语法格式:
window.resizeBy(水平,垂直) 功能:将当前窗口改变指定的大小(x,y),当x、y的值大于0时为扩大,小于0时
13. resizeTo方法 语法格式:
window.resizeTo(水平宽度,垂直宽度) 功能:将当前窗口改变成(x,y)大小,x、y分别为宽度和高度。
14. scrollBy方法 语法格式:
window.scrollBy(水平位移量,垂直位移量) 功能:将窗口中的内容按给定的位移量滚动。参数为正数时,正向滚动,否则反
15. scrollTo方法 语法格式:
window.scrollTo(x,y) 功能:将窗口中的内容滚动到指定位置。
16.find方法 语法格式:
window.find() 功能:当触发该方法时,将弹出一个&find&(查找)对话窗口,并允许用户在触
发find方法的页面中查找一个字符串。
注:该属性在IE5.5及Netscape6.0中都不支持。
17. back方法 语法格式:
window.back() 功能:模拟用户点击浏览器上的&后退&按钮,将页面转到浏览器的上一页。
说明:仅当当前页面存在上一页时才能进行该操作。
注:IE5.5不支持该方法,Netscape6.0支持。
18. forward方法 语法格式:
window.forward() 功能:模拟用户点击浏览器上的&前进&按钮,将页面转到浏览器的下一页。
说明:仅当当前页面存在下一页时才能进行该操作。
注:IE5.5不支持该方法,Netscape6.0支持。
19. home方法 语法格式:
window.home() 功能:模拟用户点击浏览器上的&主页&按钮,将页面转到指定的页面上。
注:IE5.5不支持该方法,Netscape6.0支持。
20. stop方法 语法格式:
window.stop() 功能:模拟用户点击浏览器上的&停止&按钮,终止浏览器的下载操作。
注:IE5.5不支持该方法,Netscape6.0支持。
21. print方法 语法格式:
window.print() 功能:模拟用户点击浏览器上的&打印&按钮,通知浏览器打开打印对话框打印
22. blur方法 语法格式:
window.blur() 功能:从窗口中移出焦点。当与focus方法合用时必须小心,因为可能导致焦点
不断移进移出。
23. focus方法 语法格式:
window.focus() 功能:使窗口中得到焦点。当与blur方法合用时必须小心,因为可能导致焦点不
断移进移出。
24. captureEvent方法 语法格式:
window.captureEvent(Event) window.captureEvent(事件1|事件2|...|事件n) 功能:捕捉指定参数的所有事件。由于能够捕获哪些由本地程序自己处理的事件
,所以程序员可以随意定义函数来处理事件。如果有多个事件需要捕捉,各事件
之间用管道符&|&隔开。可捕捉的事件类型如下:
Event.ABORT
Event.BLUR
Event.CHANGE
Event.CLICK
Event.DBLCLICK
Event.DRAGDROP
Event.ERROR
Event.FOCUS
Event.KEYDOWN
Event.KEYPRESS
Event.KEYUP
Event.LOAD
Event.MOUSEDOWN
Event.MOUSUEMOVE
Event.MOUSEOUT
Event.MOUSEOVER
Event.MOUSEUP
Event.MOVE
Event.RESET
Event.RESIZE
Event.SELECT
Event.SUBMIT
Event.UNLOAD
25. enableExternalCapture事件 语法格式:
window.enableExternalCapture(event) 功能:enableExternalCapture方法用于捕捉通过参数传入的外部事件。
26. disableExternalCapture事件 语法格式:
window.disableExternalCapture() 功能:取消enableExternalCapture方法的设置,终止对外部事件的捕捉。
27. handleEvent事件 语法格式:
window.handleEvent(event) 功能:触发指定事件的事件处理器。
28. releaseEvent事件 语法格式:
window.releaseEvent(event) window.releaseEvent(事件1|事件2|...|事件n) 功能:释放通过参数传入的已被捕捉的事件,这些事件是由
window.captureEvent方法设置的,可释放的事件与captureEvent相同。
29. routeEvent事件 语法格式:
window.releaseEvent(event) 功能:把被捕捉类型的所有事件转交给标准事件处理方法进行处理,可转交的事
件与captureEvent相同。
30 scroll事件 语法格式:
window.scroll(X坐标,Y坐标) 功能:将窗口移动到指定的坐标位置。
window对象具有如下属性:
statusbar.visible
defaultstatus
locationbar
locationbar.visible
frames.length
innerHeight
innerWidth
menubar.visible
outerHeight
outerWidth
pageXOffset
pageYOffset
personalbar
personalbar.visible
scrollbar.visible
toolbar.visible
1. status属性 语法格式:
window.status=字符串 功能:设置或给出浏览器窗口中状态栏的当前显示信息。
小技巧:可以使用该属性设置浏览器窗口状态栏信息。
2. statusbar属性 语法格式:
window.statusbar.属性 功能:statusbar属性本身也是一个对象,用于访问它自已的visible属性从而确
定状态栏是否可见。
注:IE5.5浏览器不支持该属性。
3. statusbar.visible属性 语法格式:
window.statusbar.visible 功能:检查状态栏是否可见,如果可见则返回true,反之返回false。
注:IE5.5浏览器不支持该属性。
4. defaultstatus属性 语法格式:
window.defaultstatus[=字符串] 功能:defaultstatus属性值是浏览器窗中状态栏的默认显示信息。
5.location属性 语法格式:
window.location=URL 功能:给出当前窗口的URL信息或指定打开窗口的URL。
6. locationbar属性 语法格式:
window.locationbar.属性 功能:locationbar属性也可以看成是一个子对象,这个属性用来获取它自已的
visible属性来确定位置栏是否可见。
到目前为止,该属性只有一个子属性:visible。
注:IE5.5不支持该属性。
7. locationbar.visible属性 语法格式:
window.locationbar.visible 功能:返回位置栏是否可见,如果可见返回true,反之返回false。
注:IE5.5不支持该属性。
8. self属性 语法格式:
window.self.方法 window.self.属性 功能:该属性包含当前窗口的标志,利用这个属性,可以保证在多个窗口被打开
的情况下,正确调用当前窗口内的函数或属性而不会发生混乱。
9. name属性 语法格式:
window.name=名称 功能:返回窗口名称,这个名称是由window.open()方法创建新窗口时给定的。
在javascript1.0版本中,这个属性只能用于读取窗口名称,而到了
javascript1.1版本时,可以用这个属性给一个不是用window.open()方法创建的
窗口指定一个名称。
10. closed属性 语法格式:
window.closed 功能:closed属性用于返回指定窗口的实例是否已经关闭,如果关闭,返回true
,反之返回flase。
11. frames属性 语法格式:
window.frames["框架名称"] window.frames[数值] 功能:frames属性是一个数组,用来存储文档中每一个由元素创建的子窗口(框
架)实例,其中的下标即可以是次序号也可以是用FRAME元素的NAME属性指定的名
称来得到并使用。
12. frames.length属性 语法格式:
window.frames.length 功能:frames.length属性用于给出文档中子窗口(框架)实例的个数。
13. length属性 语法格式:
window.length 功能:length属性返回一个窗口内的子窗口数目,该属性与
window.frame.length属性的值相同。
14. document属性 语法格式:
window.document.事件 window.document.方法 window.document.属性 功能:window对象的子对象document是javascript的核心对象,在脚本中遇到
BODY元素时创建一个实例。
15. history属性 语法格式:
window.history[数值] window.history.方法() window.history.属性 window对象的子对象history是javascript的核心对象之一,该属性包含了一个
已访问过页面的名称和URL的数组。
16. innerHeight属性 语法格式:
window.innerHeight=数值 功能:返回或指定浏览器窗口中文档的像素高度,这个高度不包括任何工具栏和
组成窗口的页面修饰高度。
注:IE5.5不支持该属性。
17. innerWidth属性 语法格式:
window.innerHeight=数值 功能:返回或指定浏览器窗口中文档的像素宽度,这个宽度不包括任何工具栏和
组成窗口的页面修饰宽度。
注:IE5.5不支持该属性。
18. menubar属性 语法格式:
window.menubar.属性 功能:menubar属性也可以看成是一个子对象,这个属性用来获取它自已的
visible属性来确定菜单栏是否可见。
到目前为止,该属性只有一个子属性:visible。
注:IE5.5不支持该属性。
19. menubar.visible属性 语法格式:
window.menubar.visible 功能:menubar.visible属性用于返回菜单栏是否可见,如果可见返回true,反
之返回false。
注:IE5.5不支持该属性。
20. opener属性 语法格式:
window.opener window.opener.方法 window.opener.属性 功能:opener属性与打开该窗口的父窗口相联系,当访问子窗口中operer属性时
,返回的是父窗口。通过该属性,可以使用父窗口对象中的方法和属性。
21. outerHeight属性 语法格式:
window.outerHeight 功能:outerHeight属性用于访问浏览器窗口的像素高度,该高度包括工具栏和
装饰边的高度。
注:IE5.5不支持该属性。
22. outerWidth属性 语法格式:
window.outerWidth 功能:outerWidth属性用于访问浏览器窗口的像素宽度,该宽度包括工具栏和装
饰边的宽度。
注:IE5.5不支持该属性。
23. pageXOffset属性 语法格式:
window.pageXOffset=数值 功能:指定浏览器窗口中文档左上角在窗口中的当前水平像素位置。在利用
moveTo移动之前,可以通过该属性来决定是否需要移动窗口。因为该属性返回了
可见文档相对整个页面的当前位置。
注:IE5.5不支持该属性。
24. pageYOffset属性 语法格式:
window.pageYOffset=数值 功能:指定浏览器窗口中文档左上角在窗口中的当前垂直像素位置。在利用
moveTo移动之前,可以通过该属性来决定是否需要移动窗口。因为该属性返回了
可见文档相对整个页面的当前位置。
注:IE5.5不支持该属性。
25. parent属性 语法格式:
window.parent.frames[数值] window.parent.framesName 功能:访问各个子窗口(多框架)所在的父窗口。
26. personalbar属性 语法格式:
window.personalbar.属性 功能:personalbar属性本身也是一个对象,用于访问其自身的visible属性来确
定个人栏是否可见。
注:IE5.5不支持该属性。
27. personalbar.visible属性 语法格式:
window.personalbar.visible 功能:确定个人栏是否可见,如果可见则返回true,反之返回false。
注:IE5.5不支持该属性。
28. scrollbars属性 语法格式:
window.scrollbars.属性 功能:scrollbars属性本身也是一个对象,用于访问其自身的visible属性来确
定滚动栏是否可见。
注:IE5.5不支持该属性。
29. scrollbars.visible属性 语法格式:
window.scrollbars.visible 功能:scrollbars.visible用于确定滚动栏是否可见,如果可见则返回true,反
之返回false。
注:IE5.5不支持该属性。
30. toolbar属性 语法格式:
window.toolbar.属性 功能:toolbar属性本身也是一个对象,用于访问它自已的visible属性从而确定
工具栏是否可见。
注:IE5.5不支持该属性。
31. toolbar.visible属性 语法格式:
window.toolbar.visible 功能:toolbar.visible属性用于检查工具栏是否可见,如果可见则返回true,
反之返回false。
注:IE5.5不支持该属性。
32. top属性 语法格式:
window.top.frames[数值] window.top.frameName window.top.方法() window.top.属性 功能:window对象的top属性用于包含所有装入浏览器的子窗口(多框架)的最顶层窗口的信息。
网奇网络原创文章,本文地址:,转载请注明出处。
的相关新闻
新手建站指导
免费网站模版
本文评论    (0)
同意评论声明
尊重网上道德,遵守中华人民共和国的各项有关法律法规
承担一切因您的行为而直接或间接导致的民事或刑事法律责任
本站管理人员有权保留或删除其管辖留言中的任意内容
本站有权在网站内转载或引用您的评论
参与本评论即表明您已经阅读并接受上述条款
快速了解网奇
网奇产品导航
网奇 网站管理系统
网奇客户案例
Hot Search:|||||||||||||||||||||||||JS中的克隆与数据属性和访问器属性
一、数据属性和访问器属性:
(1)在ECMAScript5中用Object.keys可以获取到对象的所有的可枚举属性的字符串数组,如果用于原型,那么就获取原型上面的所有的属性,如果用于实例,那么就返回实例属性。如果你想得到所有的实例属性,不管他是否可以枚举就可以用Object.getOwnPropertyNames方法,这个方法连constructor也会迭代出来!
(2)Object.keys和Object.getOwnPropertyNames可以用于替代for..in循环!(for..in既可以获取实例属性也可以获取原型属性,但是必须是可以枚举的属性)
(3)如果是访问器属性(对象)那么有configurable,enumerable,get,set,如果是数据属性那么有configurable,enumberable,writable,value属性!
& & 数据属性:
&[[configurable]]表示能否通过delete删除属性从而重新定义属性,能否修改属性的特性,能否把属性修改为访问器属性,如直接定义默认为true
&[[enumerable]]表示能够通过for..in循环返回属性,直接在对象上定义为true,如果调用defineProperty未指定就是false
&[[writtable]]表示是否能够修改属性的值,直接在对象上定义为true,如果调用defineProperty未指定就是false
& [[value]]包含这个属性的值,读取属性的时候从这个位置开始读,写入属性的时候把新值保存在这个位置中,默认为undefined
&这些特性是为了JS引擎用的,因此在JS中不能直接访问他们!要修改属性默认的特性必须使用ECMAScript5提供的Object.defineProperty方法,接受的参数为三个:属性所在的对象,属性的名字,一个描述符对象!描述符对象的属性必须是configurable,enumerable,writtable,value!设置其中的一个或者多个可以修改对于的特征值!
var person={}
Object.defineProperty(person,&name&,{writable:false,value:&Nicholas&});
//打印&Nicholas&
alert(person.name);
//设置新的值,但是因为writable是false表示不能够修改name的值,所以不变,如果将writable改为true那么name就是新的值!
person.name=&xxxx&;
alert(person.name);注意:因为name的writable是false表示不能修改,如果在非严格模式下赋值会被操作,在严格模式下直接抛出错误!
var person={}
Object.defineProperty(person,&name&,{configurable:false,value:&Nicholas&});
//打印&Nicholas&
alert(person.name);
//因为name属性的configurable为false表示不能直接删除属性,于是如果在非严格模式下直接忽略,在严格模式下抛出异常
delete person.name
alert(person.name);注意:一旦把属性定义为不可配置的,那么就不能把它变回可配置的了,这时候使用Object.defineProperty方法修改除了writtable以外的任何特效都会报错!也就是只能修改writable属性!同时如果在调用defineProperty时候不指定configurable,enumerable,writable默认都是false
访问器属性:
不包含数据值,他们包含一对儿getter和setter方法,但两种不是必须的!读取时候调用getter,设置时候调用setter,访问器属性有4个特效
& & &[[configurable]]对于直接在对象上定义的属性这个默认是是true,如果调用defineProperty未指定就是false
& & &[[Enumerable]]对于直接在对象上定义的属性这个默认是是true,如果调用defineProperty未指定就是false
& & [[GET]]读取属性时候调用的方法,默认是undefined
& & [[Set]]设置属性是调用的方法,默认为undefined!
访问器属性不能直接定义,必须使用definePeroperty定义!
var book={
_year:2004,//下划线表示只能通过对象方法访问的属性,也就是是通过调用对象的方法修改的!这里是调用book对象的set方法完成的!
Object.defineProperty(book,&year&,//通过defineProperty方法创建一个year属性,是一个访问器属性!对该属性的设置会调用set方法!
get:function()
return this._//这里的this就是book对象,这一点要弄清楚!
set:function(newValue)
if(newValue&2004)
this._year=newV//this指的是book对象
this.edition+=newValue-2004;
//他会调用book的year的set方法进行设置!
book.year=2006;
alert(book.edition);
//打印2006
alert(book._year);总结:要设置访问器属性必须通过defineProperty方法来完成!虽然可以直接对_year进行赋值,但是这么做没有任何意义,因为他不会导致edition的改变,所以这里用了下划线表示不要对它进行直接赋值,他的改变是通过其它代码来完成的,相当于私有属性一样!在这个方法之前要创建访问器属性是通过_defineGetter_和_defineSetter_方法,如book._defineGetter_(&year&,function(){return this._year}),在不支持defineProperty的方法的浏览器中configurable和enumerable是不可以改变的!
二、通过defineProperties定义多个属性:
var book={
//通过defineProperties定义多个属性!
Object.defineProperties(book,
_year:{value:2004},
edition:{value:2},
get:function()
return this._//这里的this就是book对象,这一点要弄清楚!
set:function(newValue)
if(newValue&2004)
this._year=newV//this指的是book对象
this.edition+=newValue-2004;
总结:通过defineProperties定义多个属性,两个数据属性还有一个访问器属性!
三、通过ECMAScript5的Object.getOwnPropertyDescriptor获取属性描述符
& & 该方法接受两个参数,属性所在的对象和要读取的其描述符的属性名称,返回值是一个对象,如果是访问器属性那么有configurable,enumerable,get和set,如果是数据属性那么有configurable,enumerable,writable,value值!该方法只能用于实例属性,要想取得原型属性描述符必须在原型对象上面调用!
& 在js中可以针对任何对象包括DOM和BOM对象使用object.getOwnDescriptor方法!
四、通过isPrototypeOf确定对象之间的关系
& & &如person.prototype.isPrototypeOf(person1);
五、通过Object.getPrototypeOf获取对象原型
& & 如Object.getPrototypeOf(person1)===Person.Prototype,获取该原型可以用于实现原型的继承特别有用!当原型和实例属性同名的时候,实例属性会屏蔽原型属性的值,这时候一个较好的方法就是用delete方法删除实例属性进而恢复到原型属性的引用!
六、通过hasOwnProperty检测一个属性是存在于实例中还是原型中
& &这个方法继承于object,所以任何对象都可以调用,只有给定属性存在于对象实例中才会返回true.见下例:
function hasPrototypeProperty(obj,name)
//不能存在于对象本身上面,但是必须存在于原型上面,最终结果就是判断obj的原型是否有某个属性!
return !obj.hasOwnProperty(name)&&(name in obj)
}七、通过Object.keys,getOwnPropertyNames获取所有可枚举的字符串数组
& & &keys方法用于原型对象就获取原型上面的所有的可以枚举的属性集合,用于实例对象那么就只是获取实例上面的所有的可枚举的属性集合(不包括原型上面的属性)。如果要获取所有的属性,不管他是否可以枚举,那么就用getOwnPropertyNames方法
function Person()
Person.prototype.name=&xxx&;
Person.prototype.sex=&female&;
var p=new Person();
Object.defineProperty(p,&age&,
enumerable:false,
value:120//这里没有分号!
//打印[age],用于实例对象只是获取实例上面的所有的可以枚举以及不可以枚举的属性,不包括原型上面的属性
//例如这里的enumerable是false表示不可以枚举,但是依然被打印出来!
alert(Object.getOwnPropertyNames(p));
//打印[constructor,name,sex]虽然constructor不能被枚举,但是依然被打印出来!
alert(Object.getOwnPropertyNames(Person.prototype));对于keys方法只能打印enumerable是true的属性,但是getOwnPropertyNames连enumerable为false也一起打印:
function Person()
Person.prototype.name=&xxx&;
Person.prototype.sex=&female&;
var p=new Person();
Object.defineProperty(p,&age&,
enumerable:false,
value:120//这里没有分号!
//打印[]空数组,因为age的enumerable是false所以keys方法不会将他打印出来!
alert(Object.keys(p));
//打印[name,sex],keys方法也不会打印enumerable为false的属性
alert(Object.keys(Person.prototype));八、重写prototype后导致的问题
function Person()
//这相当于完全重写原型了,于是原型的constructor不再指向上面的构造函数了,而是指向了object函数了!所以p的constructor指向了Object函数!
//但是instanceof操作符还是正确的!因为Person.prototype仍然在p对象的原型链中!
Person.prototype={
name:&xxx&,
sex:&female&
var p=new Person();
//打印true,因为p的原型是Person.prototype,但是Person.prototype的原型是Object.prototype了
//所以Person.prototype仍然在p对象的原型链中!
alert(p instanceof Person);
//打印function Object(){[native code]}
alert(p.constructor);
//打印function Object(){[native code]}
alert(Person.prototype.constructor);
//打印function Function(){[native code]}
alert(Person.constructor);注意:如果确实需要constructor返回正确的值,那么我们应该在原型中添加一句constructor:Person,但是这样做也是有负作用的,这回导致constructor的enumerable属性变成true,而原生的constructor是不可以枚举的,于是我们还是建议在defineProperty上修改,而不是在原型上面直接修改!
function Person()
//下面这一句new代码已经建立了从p到Person.prototype的指针了
var p=new Person();
//这相当于重写整个原型对象,但是前面的p仍然指向原来的原型对象,这就是重写整个原型对象的结果!
Person.prototype={
constructor:Person,
name:&xxx&,
sex:&female&,
sayName:function()
alert(&name&);
//打印p.sayName不是一个函数的错误!因为原来的p从实例属性到原型属性都没有sayName函数!
p.sayName();注意:虽然对原型的任何修改可以马上反映到所有的实例对象上面,但是,这中情况不包括重写整个实例!
八、Object.create方法
& ECMAScript引入该方法是为了规范原型继承,接受两个参数,第一个是用作新对象的原型的对象(可选的),第二个是为新对象定义额外属性的对象。传入一个参数情况下,与下面object方法相同(注意object返回的对象继承了传入的参数的原型属性和实例属性):
function Person()
Person.prototype.sex=&female&;
function object(o)
{ function F(){}
//把参数作为返回的对象的原型,也就是返回的对象会具有该参数对象的所有的属性和方法!
F.prototype=o;
return new F();
var p=new Person();
p.age=120;
alert(object(p).age);
//打印female
alert(object(p).sex);例2:
//这种方式的继承会导致继承对象的所有属性,但是这种方式会导致数组等引用对象的继承导致共享
//导致牵一发而动全身的情况!这是原生继承的弊端!
var person={
name:&xx&,
friends:[&a&,&b&]
var p1=Object.create(person);
p1.name=&yyy&
p1.friends.push(&c&);
var p2=Object.create(person);
p2.name=&zzz&
p2.friends.push(&d&);
//打印[a,b,c,d]
alert(person.friends);
//打印[a,b,c,d]
alert(p1.friends);
//打印[a,b,c,d]
alert(p2.friends);
alert(person.name);
alert(p1.name);
alert(p2.name);
//我们给create方法传入第二个参数,要注意这个第二个参数的格式问题!
var result=Object.create(person,{sex:{value:&female&}})
//打印female,也就是create方法的第二个参数是为新对象定义额外的属性!
alert(result.sex);
九、for..in和in的区别
//for..in语句用于对数组或者对象进行遍历!返回的是所有能够通过对象访问并且可以枚举的属性
//其中既包括存在于实例中的属性也包括存在于原型中的属性
var obj=[&zhao&,&liang&,&zl&,&an&];
for(var j in obj)
document.write(j+&=&+obj[j]+&\n&);
var obj2={&name&:&zl&,&age&:&24&,&sex&:&男&};
for(var j in obj2)
document.write(j+&=&+obj2[j]+&\n&);
toString:function()
return &My Object&
for(var prop in o)
//对象o定义了toString方法该方法屏蔽了原型中不可枚举的toString方法,所以也会被其它浏览器枚举
//但是在IE早期版本,不会有弹出框,在IE中屏蔽不可枚举属性的实例属性不会出现在for.in循环中!
if(prop===&toString&)
alert(&Found toString!&);
}注意:屏蔽原型属性不能枚举的属性的实例属性在其它浏览器中会被枚举,早期IE浏览器除外,所以hasOwnProperty,toLocalString,toString,valueOf,propertyIsEnumerable等在其它浏览器中都能够被屏蔽!同时constructor,prototype的enumerable也是false!in方法用于判断一个对象的实例属性或原型属性是否有特定的属性,不管是在实例属性还是原型属性中都返回true!
十,通过前面的方法实现克隆对象
function copy(o){
var copy = Object.create( Object.getPrototypeOf(o) );
//getOwnPropertyNames如果用于实例那么获取所有的实例属性,如果用于prototype那么就是获取所有的原型属性!和Object.keys一样!
var propNames = Object.getOwnPropertyNames(o);
//迭代属性和方法
propNames.forEach(function(name){
//可以获取给定属性的描述符,返回值是一个对象,如果是访问器属性(对象)那么有configurable,enumerable,get,set,如果是数据属性那么有
//configurable,enumberable,writable,value属性!
var desc = Object.getOwnPropertyDescriptor(o, name);
//把这些方法放在copy上面!
Object.defineProperty(copy, name, desc);
var o1 = {a:1, b:2,c:{name:&xxx&,sex:&female&}};
var o2 = copy(o1); // o2 looks like o1 now
alert(o2.c.sex);
注意:该方法的思路是首先继承o对象原型上面的所有的属性,然后通过getOwnPropertyNames获取所有实例属性,进而通过getOwnPropertyDescriptor获取该属性的签名,最后赋值到对象上面返回!
Object中的其它方法:
(1)preventExtensions方法,可以定义防止串改的对象,调用该方法以后就不能添加任何新属性和方法了,在严格模式下会报错,在非严格模式下会失败。但是现有的对象所具有的属性还是可以修改和删除的!
(2)isExtensible方法用于判断对象是否可以拓展
(3)seal是第二个保护级别的密封对象,该对象不能拓展,而且已有成员的[[Configurable]]属性设置为false,这意味着不能删除属性和方法。因为不能通过Obejct.defineProperty把数据属性修改为访问器属性,或者相反。但是属性值可以修改!(可以用sealed判断)
var benjamin = {
name: &Benjamin&
sealed = Object.seal(benjamin),
benjamin.name=&xxx&;
alert(benjamin.name);//打印&xxx&,不能删除,不能修改属性的特性,但是依然可以修改值!
(4)最严格的防篡改级别就是冻结对象,该对象不可扩展,同时又是密封的,而且属性[[writtable]]也是false,如果定义[[set]]方法那么访问器属性仍然是可写的!可以用isFrozen()方法来判断!与密封对象和可扩展对象一样,在非严格模式下操作会被忽略,在严格模式下抛出异常!
note:对javascript库的作者来说,冻结是很有用的,因为js库最怕有人意外修改库中的核心对象,冻结主要的库对象可以防止这种问题的产生!用法参见博客
更多相关文章
数据属性:该属性包含了一个数据值的位置,它包含了4个描述行为的特性:1. [[Configurable]]:表示是否能通过delete删除属性从而重新定义属性,能否修改属性的特性,能否把属性修改为访问器属性.2. [[Enumerable]]:表示能否用for-in循环返回.3. [[writabl ...
访问器属性不包含数据值:它们包含一对getter和setter函数(不过,这两个函数都不是必须的).在读取访问器属性时,会调用getter函数,这个函数负责返回有效的值:在写入访问器属性时,会调用setter函数并传入新值,这个函数负责决定如何处理数据.访问器属性有如下4个特性. [[Configu ...
在js中定义的全局变量是挂在window下的,而window的属性也一样,那么这两者有什么区别呢? 其实这两者还是有小小的区别的,全局变量是不能通过delete操作符删除的,而直接定义在window上的属性是可以删除的.
那么为什么全局变量不能删除呢? 因为全局变量也是个对象,这个对象时通过叫做 ...
一直觉得c#中的get,set访问器是个好东西,能很好的完成数据读取和写入的其他附加操作,这对于数据同步等都是很方便的. 可是,前段时间的一个类中有List泛型,这个的get,set如何写呢?一开始死活找不到答案
后来在一个实例代码中,看到原来是这么写的
public D ...
(一).访问最顶层窗口 window.top.对象.属性=参数 (二).访问上一层窗口 window.parent.对象.属性=参数 (三).访问某一层的窗口 1.采用绝对路径访问 window.top.[frames(&次层框架名&).[frames(&次次层框架名& ...
(原来HTML里是document.body
--XHTML里是document.documentElement ,都指的是&body&节点(OR元素) )
在设计页面时可能经常会用到固定层的位置,这就需要获取一些html对象的坐标以更灵活的设置目标层的坐标,这里可能就会用到doc ...
上次讲了个简单的继承,这次 咱们讲个稍微复杂点的,那就是让子类继承父类的属性和方法,假设人 (Person)是父类,工人(Worker)是子类,让worker继承person的属性和方法:父类:function Person(name,age){
this.name=
a = 1; console.log( window.a ); // 1 console.log( delete window.a ); // true console.log( window.a ); // undefined var b = 2; console.log( window.b ); ...
在上文中我们实现了利用Service来设计HAL,但是根据Android的框架,一般应用程序都不直接和Service打交到,中间需要经过一个Manager层. 我们在这里也按照Android的框架,进一步优化HAL的 ...
AD RID 池用尽系是一个很危险的事情,假如没有相应的控制任用而导致RID池耗尽,将使到 ...
Oracle数据库:
是甲骨文公司的一款关系数据库管理系统
具有网格计算的框架
数据量大,并发操作比较多,实时性要求高,采取ORACLE数据库
Oracle数据库的体系结构包括物理存储 ...
\ 英文原文:How Successful People Stay Calm 在压力下管理 ...
1 using S 2 using System.IO; 3 using System.T 4 using System.W 5 using System.Web.S 6 u ...
上个月17日,36大数据曾介绍了一个世界级的大数据投资基金Accel Partners B ...
1.包含关系:.h文件一般包含在.cpp文件中,.h文件中多为变量和类的声明,而.cpp文件才是变量和类中函数的真正定义.但是#include &iostream& 这个文件既不是.c也不是.h,那我们能 ...
本来不想回来,这里有着读研期间3年痛苦的过去,以及放在回收站里的那些自己都不忍心看的文章,但始终的有一个地方供自己去小憩一下,整理下奔跑中的思维,偶尔停留一下. 然后把过去几年里的文章全都删除,从此以后,这里只有原创 ...
/viewthread.php?tid=838935&highlight=%BF%ED%B4%F8 这个问题首先需要讨论宽带信号与窄带信号的定义.然而,没有文献或组织 ...
&编程导论(Java)&相关链接.下载PPT下载地址:CSDN(9.7MB)

我要回帖

更多关于 js打印对象属性 的文章

 

随机推荐