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)