犀牛-6对象

对象:字符串到值得映射;自有的属性;继承的属性。也称作关联数组。

字符串,数字和布尔值:它们不是对象。当引用了它们的属性,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    

原文地址:https://www.cnblogs.com/wang-jing/p/3954397.html