Object 详解

1、object的原型

默认创建的对象字面量变量其原型指向Object.prototype

obj.__proto__===Object.prototype  //true

2、object.constructor 

对象字面量的constructor 指向Object 

obj.constructor===Object //true

构造函数实例对象的constructor 指向构造函数本身

o.constructor===FunObj //true

创建的基础类型变量其constructor 指向基础类型如String

3、Object.assign(target,source,source)

将来至于一个或多个源对象的值复制到目标对象

返回值为目标对象

此方法会直接在目标对象上修改,会把所有源对象上的值都复制过去。

会替换目标对象上原有的值。

可用于复制对象

var a=Object.assign({},source)

4、Object.create(prototype_object,descriptors)

创建一个具有指定原型具可选性地包含指定属性的对象

prototype_object::必需的用做新对象的原型。可以为null

descriptors:可选 的,用来创建属性和定义其配置属性

返回一个具有指定的内部原型的新对象

var par={x:1}
			//创建对象,原型是参数对象
			var obj=Object.create(par);
			obj.y=2;
			console.log(obj.x,obj.y)
			console.log(obj.hasOwnProperty('x'))//false
			
			console.log(obj.__proto__)//{x:1}
			
			//对象原型是par
			console.log(obj.__proto__===par)//true
			//par 对象的原型是object的prototype
			console.log(par.__proto__===Object.prototype)//true
			console.log(Object.prototype.__proto__===null)//true

新对象的__proto__指向par。par.__proto__指向Object.prototype

//创建原型为null的对象
			var a=Object.create(null)
			console.log(a.toString)//undefined
			console.log(a.__proto__)//undefined

Object.create({})  生成对象 原型是参数对象
生成的对象的原型指向参数对象
参数对象的原型指向了Object.prototype
create参数为null,其对象的原型是undefined 不会继承object.prototype
对象字面量的原型是Object.prototype

5、对象原型链:

构造函数创建的实例对象原型链:

obj.__proto__===Funobj.prototype //ture

Funobj.prototype.__proto__===Object.prototype//true

Object.prototype.__proto__===null //true

实例对象原型是构造函数的原型对象,原型对象的原型是Object的原型对象

构造函数__proto__:

Fun1.__proto__===Function.prototype

Number.__proto__===Function.prototype

Function.prototype.__proto__===Object.prototype
Object.prototype.__proto__===null

构造函数、基础类型构造函数指向Funtion 原型,它的原型的proto 指向Object的原型对象

6、for in 遍历对象

用来遍历对象上可枚举的属性和原型上可枚举的属性

属性是否可枚举通过enumerable 来配置

7、obj.hasOwnProperty(keyname)

判断对象本身是否有指定名称的属性或对象,如对象本身无此属性返回false

它通常和for in 一起使用来遍历对象属性

8、对象读写

当访问对象不存在的属性时返回undefined

当访问或设置属性是对象的属性时会报错 //obj.data.name 

当访问对象不存在的方法时会报错

在使用对象时最好先用obj && obj.XX

9、删除对象属性

可用delete obj.xx 来删除对象属性 会返回true

再访问时xx时返回undefined

再次删除xx 也会返回true

delete Object.prototype//false

有些属性是无法删除的,因为其configurable 为false

可用Object.getOwnPropertyDescriptor(Object,'prototype')

来查看其配置对象

10、对象的赋值

对象可以创建时在{}内赋值,也可用变量名.xx来赋值

还可用变量名['name'] 来赋值,也就是数组下标写法

如果[]内是个对象变量呢会先调用它们的toString当其转换成字符串,当其name来使用

obj[{name:'sar'}]='star';
console.log(obj['[object Object]'])

//调用对象的tostring 返回 "[object Object]"把它当成属性名 

如果[]内是个表达式会先计算把其结果用来name使用。

obj[1+3]=4

obj['4']//4

11、对象属性的配置参数

一个对象属性除了它的属性名和值外它还有自己的权限配置对象

可用Object.getOwnPropertyDescriptor(对象,属性名字符串)来查看配置对象

configurable:bool enumerable:bool value writable:bool get:fn set:fn 

configurable: 设置属性是否可以用delete 删除,是否可以修改 writable 、 enumerable 、 configurable 属性。

enumerable :属性是否可枚举。可枚举的含义包括: 是否可以通过 for...in 遍历到,是否可以通过 Object.keys() 方法获取属性名称。

writable ,属性是否可重写。可重写的含义包括:是否可以对属性进行重新赋值。

value ,属性的默认值。

set ,属性的重写器(暂且这么叫)。一旦属性被重新赋值,此方法被自动调用。

get ,属性的读取器(暂且这么叫)。一旦属性被访问读取,此方法被自动调用。

writeble value 和set get 不能同时使用

可以以下方法为对象属性设置其配置对象

Object.defineProperty(object, propertyname, descriptor)

将属性添加到对象,或修改现有属性的特性。
object:必需。  要在其上添加或修改属性的对象。  这可能是一个本机 JavaScript 对象(即用户定义的对象或内置对象)或 DOM 对象。  
propertyname:必需。  一个包含属性名称的字符串。  
descriptor:必需。  属性描述符。  它可以针对数据属性或访问器属性。  
返回值:已修改对象。

可使用 Object.defineProperty 函数来执行以下操作:
向对象添加新属性。  当对象不具有指定的属性名称时,发生此操作。  
修改现有属性的特性。  当对象已具有指定的属性名称时,发成此操作。

1)当writable 为false时修改会失败,值还是原型的

2)在配置时默认configurable writable enumerable 都为false

3)当配置数组或对象的权限都false时 这时可以为数组或对象添加属性如push   但是不能obj.xx= 来修改数组。

因为在push时并没有修改数组的引用地址,只是扩展了它。如果赋值了就修改了其引用地址这是不允许的

4)当enumerable 为false时是不可以用defineProperty 来修改配置对象的会报错

5)set get 用法:

Object.defineProperty(obj,'number',{				
				set:function(v){
					this._number=v;
				},get:function(){
					return this._number
				},enumerable:true,configurable:true
			})
set用来修改值,get 用来返回值。方法内用this把其保存在了对象上

访问和修改number时其实操作的是_number属性

这样会在对象上创建_number属性,它是暴露出来的

function Fun1(age){
				this.age=age;//会调用get age 方法
			}
			//需要注意写法 get XX(){}  
			//_age会在对象上创建
			Fun1.prototype={
				get age(){
					return this._age;
				},
				set age(v){
					this._age=v;
				}
			}
			var a=new Fun1(22);
			console.log(a.age)
			a.age=33;//设置age
			console.log(a.age)
以上是在构造函数原型上定义get set 方法。

其写法要注意是:get 属性名 (){} 

实例对象a上有_age属性就是age的值,当age设置或访问时会调用原型上定义的age get set 。

它也会在对象上暴露出_age

//在函数内定义私有变量_age,扩展this的age属性
			//get 和set 都使用_age
			function Funb(age){
				var _age=18;
				Object.defineProperty(this,'age',{//这里的get set 写法是函数
					get:function(){
						return _age;
					},set:function(value){
						if(value>18){
							_age=value;
						}						
					}
				})
				if(age>18){
					this.age=age;
				}
			}
			var b=new Funb(33)//如果小于18 就是18 大于设置
			console.log(b.age);
			b.age=3;//小于18
			console.log(b.age);//33

以上代码在构造函数内创建局部变量,扩展this当前上的age方法定义其get set 值存在局部变量_age上

在set 内对年龄进行了判断,验证其合法性

set get 可用来保护变量,对set 进行验证判断其合法性<
还可对属性修改进行监听


ECMAScript 5还定义Object.defineProperties( )方法,该方法包含两个参数:
属性所在的对象,多个属性的名字和其描述符对象组成的对象。
其作用于Object.defineProperty( )相同,区别是可一次性定于多个属性

Object.defineProperties(obj,{
name:{
get:fn,set:fn
},age:{
get:fn,set:fn
}
})

object.defineProperties(object, descriptors)<br />
将一个或多个属性添加到对象,并/或修改现有属性的特性。<br />
object:必需。  对其添加或修改属性的对象。  这可以是本机 JavaScript 对象或 DOM 对象。  <br />
descriptors:必需。  包含一个或多个描述符对象的 JavaScript 对象。  每个描述符对象描述一个数据属性或访问器属性。  
<br />
返回值:已传递给函数的对象。<br />
若要创建一个对象并向新对象添加属性,则可使用 Object.create 函数 (JavaScript)。<br />

在Object.defineProperty( )方法之前,要创建访问器属性,一般使用非标准的方法:
__defineGetter__() 和__defineSetter__(),这两个方法最初在Firefox引入
,后来chrome1和Opera9.5也支持。改写上面的tel属性访问器如下:

person.__defineGetter__("tel",function(){
   return this._tel;
});
person.__defineSetter__("tel",function(newtel){
   this._tel = newtel;
})


12、es5新增方法

1)Object.getOwnPropertyDescriptor(object, propertyname)
获取指定对象的自身属性描述符

2)Object.getOwnPropertyNames(object)

返回对象自己(本身)的所有属性或方法的的名称数组

不受配置对象影响,enumbtable为false的也会列出

3)Object.keys(obj) 

返回对象本身可枚举的属性和方法名 返回是数组

4)obj.hasOwnProperty(keyname) 

确定某个对象是否具有带指定名称的属性

5)bject.getPrototypeOf(object)
返回对象的原型对象
object:必需。引用原型的对象。

以前chromes下是用obj.__proto__来访问, 现在添加了方法规范多了

6)Object.is(value1, value2)

比对两个值是否相等

比对时不会类型转换,和===类似。区别在于is把NaN视作相同

将 + 0 和-0 视作不同值

7)Object.setPrototypeOf(obj, proto);

设置对象的原型。

8)prototypeobj.isPrototypeOf(object)

确定一object是否存在于prototypeobj的原型链中。

9)





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值