js对象的学习笔记
1.js对象的分类:a.内置对象(Array,Function,Date,RegExp);
b.宿主对象(由js解释器所嵌入的宿主环境(web浏览器)定义的,可以把宿主对象当作内置对象);
c.自定义对象(由运行中js代码所创建的对象)
2.对象的属性: a.自有属性(直接在对象中定义的属性);
b.继承属性(在对象的原型对象中定义的属性);
3.对象的原型:每一个JS对象(null除外)都和另一个对象相关联,另一个对象就是我们熟知的原型,每一个对象都从原型继承属性(原型的最顶端Object.prototype是没有原型的,Object.prototype._proto_=null).所有通过对象直接量创建的对象都具有同一个原型对象,并且可以通过js代码Object,prototype获得原型对象的引用;通过关键字new和构造函数调用创建的对象的原型就是构造函数的prototype属性的 值。因此,同使用{}创建对象一样,通过new Object()创建的对象也继承子Object.prototype。同样,通过new Array()创建的对象的原型就是Array.prototype。通过new Date()创建的对象的原型就是Date.prototype.
没有原型的对象不多,object.prototype就是其中之一,他不继承任何属性。其他的原型对象都是普通对象,其他的原型对象都是普通对象,普通对象都具有原型。所有的内置构造函数(以及大部分自定义构造函数)都具有一个继承自Object.prototype的原型。例如,Date.prototype的属性继承自Object.prototype,因此有new Date()创建的Date对象的属性同时继承自Data.prototype和Object.prototype.这一系列链接的原型对象就是所谓的“原型链”。
4.对象的原型继承:假设要查询对象o的x属性,如果o中不存在下,那么将会在o的原型对象中查询属性x。如果原型对象中也没有x,但这个原型对象也有原型,那么继续在这个原型对象的原型上执行查询,直到找到x或者找到一个原型是null的对象为止。可以看到,对象的原型属性构成了一个“链”,通过这个链可以实现属性继承。
只有查询属性才能体会到继承的存在,而设置属性则和继承无关,这是js的一个重要特性,该特性让程序员可以有选择的覆盖继承属性。
例:通过原型继承创建一个新对象
function inherit (p ){
if(p==null) throw TypeError();
if(Object.create){
return Object.create(p);
//这里的Object.create()是一个js原生继承对象的方法,
var father={x:1};
var child=Object.create(father);
console.log(children.x)
}else{
var t=typeof p;
if( t!=="object" && t!=="function") throw TypeError();
function f(){};
f.prototype=p;
return new f()
}
}
5.检测属性:
a.检测一个属性是否在一个对象中,不论是自有属性还是继承属性用 in ,如果对象包含这个属性,则返回true
var o={x:1};
"x" in o; ----->true
"y" in o ------>false;
"tostring" in o ----->false
b.检测一个属性是否是自有属性,应使用hasOwnProperty()方法
o.hasOwnProperty("x");------>true
o.hasOwnProperty("y");------>false
o.hasOwnProperty("toString")------->false
c.检测一个属性即是自有属性还必须是可枚举的属性,应使用propertyIsEnumerable()
var o=inherit({y:2}); //inherit方法上文提到过
o.x=1;
o.propertyIsEnumerable("x");---->true,x是o的可枚举自有属性
o.propertyIsEnumerable("y"); ---->false,y是继承而来的
Object.prototype.propertyIsEnumerable("toString");----->false,不可枚举
6.存取器属性getter和setter
当程序查询存取器属性的值时,调用getter方法(无参数),这个方法返回的值就是属性存取表达式的值。
当程序设置存取器属性的值时,调用setter方法,将赋值表达式右侧的值当作参数传入setter,从某种意义上讲,这个方法负责“设置”属性的值,可以忽率setter方法返回的值
7.属性的特性
a.数据属性的特性: 1.值,2.可写性,3.可枚举,4.可配置
b.存取器的4个特性:1.读取,2写入,3.可枚举,4.可配置
通过调用Object.getOwnPropertyDescriptor可获得某个对象特定属性的属性描述符;
Object.getOwnPropertyDescriptor({x:1},“x”);---->返回{value:1,writable:true,enumberable:true,configable:true}
Object.getOwnPropertyDescriptor({},“x”);---->返回undefined,没有这个属性
Object.getOwnPropertyDescriptor({},“toString”)---->返回undefined,继承属性
要想设置属性的特性,或者想让新建的属性具有某种特性,则需要调用Object.defineProperty();
var o={};
Object.defineProperty(o,"x",{value:1,writeable:true,enumberable:false,configurable:true})----->添加一个不可枚举的数据属性x,并赋值为1;
// o.x----->1;
// Object.keys(o);---->[];空数组,Object.keys()方法返回一个数组,这个数组有对象中可枚举的自有属性的名称组成;
//另外还有一个方法是Object.getOwnPropertyNames(),他只返回对象的所有自有属性的名称,而不仅仅是可枚举的
8.对象的三个属性:
a.原型属性;
检测一个对象是否是另一个对象的原型(或处于原型链中),应使用isPrototypeOf()方法
var p={x:1};
var o=Object.create(p);
p.isPrototypeOf(o);----->true,o继承p;
Object.Prototype.isPrototypeOf(o);true,p继承自Object.prototype
b.类属性;
对象的类属性是一个字符串,用以表示对象的类型信息
c.可扩展性;
对象的可扩展性用以表示是否可以给对象添加新属性。所有内置对象和自定义对象都是显示可扩展的。ECMAScript定义了用来查询和设置对象可扩展性的函数。通过将对象传入Object.esExtensible()来判断对象是否是可扩展。
如果想将对象设置为不可扩展到可以调用Object.preventExtensions().将对象以参数的形式传入,如果将对象转换为不可扩展的,就无法将将其再转换为可扩展的
Object.seal().不仅可以将对象设置为不可扩展的,还可以将对象的自有属性设置为不可配置的,其自有属性不能删除或配置,但已有可写属性依然可以设置。同样的对于那些已经封闭的(sealed)对象是不能解封的,可以使用Object.isSealed()来检测对象是否封闭。
Object.freeze(),不仅可以将对象设置为不可扩展和属性设置为不可配置外,还可以将自有属性设置为只读。是有Object.isFrozen()来检测对象是否冻结。
9.对象的序列化
对象的序列化是指将对象的状态转换为字符串,也可将字符串还原为对象。ECMAScript5中提供了内置函数JSON.stringify()和JSON.parse()用来序列化和还原对象。
JSON.Stringify()用来将对象转换为字符串,JSON.parse()用来将字符串转换为对象。

浙公网安备 33010602011771号