1.对象是可变的,我们通过引用而非值来操作对象。如果变量x是指向一个对象的引用,那么执行代码var y = x;变量y也是指向同一个对象的引用,而非这个对象的副本。通过变量y修改这个对象亦会对变量x造成影响。
2.创建对象的3种方式:对象直接量、关键字new、Object.create()函数。
3.内置构造函数的原型是只读的:
Object.prototype = o;//赋值失败,但是没报错,Object.prototype没有修改;在严格模式中,任何失败的属性设置操作都会抛出一个类型错误异常。
4.delete只能删除自有属性,不能删除继承属性(要删除继承属性必须从定义这个属性的原型对象上删除他,而且这会影响到所有继承自这个原型的对象)
5.delete不能删除那些可配置属性为false的属性。在严格模式下,汇报一个类型错误;非严格模式下,会返回false.
delete Object.prototype;//不能删除,属性是不可配置的
var x = 1;//声明一个全局变量
delete this.x;//不能删除
function f(){}//声明一个全局函数
delete this.f;//也不能删除全局函数
this.x = 1;//创建一个可配置的全局属性
delete x;//非严格模式返回true,严格模式返回语法错误
delete this.x;//正常工作
6.==:null == undefined;//true
===:null === undefined;//false
7.getter和setter属性(存取器属性):存取器属性不具有可写性。如果属性同时具有getter和setter方法,那么他是一个读写属性。
var o = {
//普通的数据属性
data_prop:value,
//存取器属性都是成对定义的函数
get accessor_prop() {/*函数体*/}//函数体内可以使用this关键字。
set accessor_prop(value){/*函数体*/}
};
8.属性的特性:Object.getOwnPropertyDescriptor()只能得到自有属性的描述符。对于继承属性和不存在的属性,返回undefined
9.对象的三个属性:原型、类、可扩展性
10.检测一个对象是否是另一个对象的原型(或处于原型链中),请使用isPrototypeOf()方法:
var p = {x:1};//定义一个原型对象
var o = Object.create(p);//使用这个原型创建一个对象
p.isPrototypeOf(o);//true:o继承自p
Object.prototype.isPrototypeOf(o);//true:p继承自Object.prototype
11.要想获取对象的类,可以调用对象的toString()方法,然后提取已返回的字符串的第8个到倒数第二个位置之间的字符。由于很多对象继承的toString()方法都重写了,所以必须间接地调用Function.call()方法。Object.prototype.toString,call(o).slice(8,-1);
12.可扩展性:所有内置对象和自定义对象都是显示可扩展的,宿主对象的可扩展性是由JavaScript引擎定义的。
通过将对象传入Object.esExtensible(),来判断对象是否是可扩展的。如果想将对象转换为不可扩展的,可使用Object.preventExtensions(),此操作不可逆,只影响对象本身,不影响原型的扩展性。
通过将对象传入Object.isSealed(),来判断对象是否封闭。Object.seal()除了将对象设置为不可扩展的,还可以将对象的所有自有属性都设置为不可配置的。也就是说,不能给这个对象添加新属性,而且他已有的属性也不能删除或配置,不过已有的可写属性依然可以设置。不能解封。
Object.freeze()冻结,除了将对象设置为不可扩展的和属性设置为不可配置的之外,还可以将他的所有数据属性设置为只读的(如果对象的存取器属性有setter方法则不受影响)。使用Object.isFrozen()检测是否冻结。
//创建一个封闭对象,包含一个冻结的原型和一个不可枚举的属性
o.x;//==》1
o.x = 222;//==>1
o.y = 123;//==>123
Object.keys(o)//==>[]
网友评论