对象:字符串到值得映射;自有的属性;继承的属性。也称作关联数组。
字符串,数字和布尔值:它们不是对象。当引用了它们的属性,js会调用new XXX()转为对象,引用结束,则临时对象(包装对象)会消失。对属性的赋值,会被忽略。也可以显示的包装对象。typeof 包装对象:object。没有实际的意义
通过引用来操作对象
var x={ name:'sfp' }; var y=x; x.name='wj'; console.log('y.name:'+y.name);
属性名为空字符串
var x={ name:'s', '':'sfp' }; for(var key in x) { if(key==''){ console.log(key+':'+x[key]); //注意取值的形式,为什么不能用.呢? } }
属性值可以使getter或setter函数
每个属性都有属性特性:5之前都可写,可枚举(for in可输出),可配置(删除,修改)。
对象的对象特性:prototype,class,extensible flag。
内置对象,宿主对象(htmlelement,也为内置),自定义对象,自有属性,继承属性。
历史原因:属性名为保留字,需加引号;最后一个逗号需要加上。属性名内有空格,连字符,保留字,都需加引号。
null:没有原型,属性,方法,值。null instanceof Object:false,
对象字面量创建的对象的原型为object.prototype;new Constructor()创建的对象的原型是构造函数的prototype。
没有原型的对象:null,Object.prototype。内置构造函数和大部分自定义的函数的原型都是Object.prototype。
Object.create():用原型来创建对象,是一个静态函数,不是提供给某个对象调用的方法。例1、Object.create(null):没有原型的对象,不继承任何属性和方法;例2、Object.create(Object.prototype):普通的空对象。
.和[]的应用场景:事先不知道属性名时,可以使用[]来动态的更改:['address'+i];
属性访问出错的处理方法:出错的情况:访问null和undefined的属性时,会报错。处理方法:var len=book && book.subtitle && book.subtitle.length。
给null和undefined设置属性也会报错。给其他类型设置属性,也有可能出错(5 strict)。在三种场景下,给对象设置属性会失败。
删除属性的问题:delete不能删除继承属性。通过prototype的不能删除,如果是通过call()继承的呢?为什么就可以删除呢?
function ClassA(p){ this.p=p; } function ClassB(x){ ClassA.call(this,x); this.q='f'; } var a=new ClassA('s'); var b=new ClassB('s'); //delete a.p; delete b.p; console.log(a.p); console.log(b.p); //undefined
推测:继承属性是在对象的原型对象中定义的属性,而p不是在ClassB.prototype中定义的,不是继承属性。我只是想看一下通过对象冒充继承的属性,可不可以。
delete只是断开了属性和对象的联系,而不去操作属性内部的属性:a={p:{x:1}};b=a.p;delete a.p;结果是b.x依然是1。
p127