创建对象-new/原型链
function foo(){};
foo.prototype.z=3;
//此时使用new 构造器创建foo()的实例
var obj = new foo();
obj.y = 2;//obj的原型[[proto]]指向构造器的原型 foo.prototype
obj.hasOwnProperty('z')//false因为这个属性并不在obj本身的原型上
obj.z=undefined;
obj.z;//undefined,这时候要使用Object.hasOwnProperty判断对象本身是否有z这个属性
创建对象-Object.creat
var obj = Object.create({x:1})//obj->{x:1}->Object.prototype
x不是obj本身的属性
对象属性操作
属性读写-异常
var obj = {x:1};
var yz = obj.y.z//报错,undefined
//可以使用if判定obj.y是否存在
if(obj.y){
yz = obj.y.z
}
//或者使用&&
var yz = obj && obj.y && obj.y.z
属性删除
- 当delete Object.obj返回true时,不代表是删除成功,只是这个属性已经不存在了
- Object.prototype内的属性不可被删除
- var定义的全局变量 不可被删除
- function fd(){};delete fd//false
- 隐式全局变量No = 1;可以 被删除
- eval中使用var定义的变量可以被删除
属性检测
- 使用propertyIsEnumerable检测属性是否可以被枚举,一般原型链上prototype很多方法返回都是false,不可被枚举
- 使用Object.defineProperty(cat,‘price’,{enumerable:false,value:1000})//其实使用Object.defineProperty定义的属性,默认enumerable就是false
属性的枚举
var o = {x:1,y:2};
var obj = Object.create(o);
obj.a = 4;
for(key in obj){
console.log(key)
}
//如果只要枚举对象本身的属性,可使用hasOwnProperty过滤
for(name in obj){
if(obj.hasOwnProperty(name)){
console.log(name)
}
}
get set方法
属性标签
使用Object.getOwnPropertyDescriptor(Object,‘name’)可以得到属性标签
- writable:true表示可写 enumerable:true表示可以被枚举,configurable:true表示能被配置(delete)
- 设置空对象,要设置对象的属性标签,可以使用Object.defineProperty(obj,字符串属性名字,{value:“auto”,writable:true表示可写 enumerable:true表示可以被枚举,configurable:true表示能被配置(delete)})
全局对象
- 全局对象的属性是全局定义的符号,js程序可以直接使用,当js解释器启动时(或者任何浏览器加载新页面的时候),它创建新的全局对象,并给他一组定义的属性
- 全局属性,undefined,Infinity和NaN等
- 全局函数,比如isNaN(),parseInt()等
- 构造函数,Date(),RegExp(),String()等
- 全局对象,比如Math(),JSON
- 如果代码声明了一个全局变量,那全局变量就是全局对象的一个属性