文章目录
对象 Object
静态成员
- keys(某个对象),得到某个对象的所有属性名数组
- values(某个对象),得到某个对象的所有属性值数组
- entries(某个对象),得到某个对象的所有属性名和属性值的数组
实例成员
实例成员可以被重写
所有对象,都拥有Object的所有实例成员
- toString方法:得到某个对象的字符串格式
默认情况下,该方法返回"[object Object]";
- valueOf方法:得到某个对象的值
默认情况下,返回该对象本身
在JS中,当自动的进行类型转换时,如果要对一个对象进行转换,实际上是先调用对象的valueOf方法,然后调用返回结果的toString方法,将得到的结果进行进一步转换。
对象属性的增删改查
- 增:如果需要给一个对象增加一个属性,
就直接对象.xxx=xxx 即可,例如:mrDeng.wife= ‘xioaliu’; - 删:如果需要删除对象的一个属性,我们需要用到一个关键字叫 delete,
delete 后边 跟上对象的属性即可,例如:delete mrDeng.age;
你再去访问 mrDeng.age 就会得到 undefined
(注意:变量未经声明就使用肯定报错,但是在对象里不会报错,而且输出 undefined) - 改:就是重新赋值,上边讲到了。
- 查:就是查看、访问,上边也讲到了。
对象的创建方法
- var obj={}
- var obj=new Object() ->构造函数
(1)系统自带的构造函数 var obj=new Object() 另外还有Array()、Number()
(2)自定义(注意:凡是构造函数,命名都用大驼峰命名法)
funciton Person(){
this.name='bmw';
}
使用: var person=new Person();
3.var obj=Object.create(原型)
这样通过Object.create也能创建出对象,括号里放的就是原型,你现在访问obj1.name 就是 a。
var obj = {name:"a"};
var obj1 = Object.create(obj);
+ 两种值:Object或null
+ ==结论:绝大多数对象最终都继承自 Object.prototype(并不是所有)==
创建一个对象的过程–构造函数内部原理
隐式的三段式:
1)当调用new时,在函数的最前边隐式的加上
var this = {
__proto__:Xxx.prototype
};
2)执行 this.xxx = xxx;
3)在最后隐式的返回 this (return this)
包装类
当原始值调用某些属性时,JS内部会给原始值一个包装类,
JS会通过一系列操作让你实现此方法。
var str= 'abc'
console.log(str.length) -->new String('abc').length; delete; //返回3
//原始值本身没有属性和方法,通过内部生成一个一样的字符串对象,
//把length拿到后返回值,然后new的对象销毁
---------------
var num = 123;
//此处给这个new的对象赋值后会直接销毁
num.abc = 'abc' ->(隐式操作)new Number(num).abc = 'abc'; delete;
//解释:当console.log()时会再创建一个对象:new Number(num).abc
//因为赋值的对象已经删除,这个num没有abc的属性,所以返回undefined
console.log(num.abc) //undefined
对象的枚举(遍历)
for … in … 循环
- 如果对象里面有原型(__proto__:{...}),也会把属性拿出。
var obj = {
name : 'du',
num : 1
}
//for...in... 循环
for(var prop in obj){
// 如果使用 obj.prop,会变成这样obj['prop'],返回undefined
console.log(obj[prop]);
}
hasOwnProperty:判断是否是自己的属性和方法
var obj = {
name: 'du',
num: 999,
__proto__: {
lastName: 'deng'
}
}
for (var prop in obj) {
//判断属性方法是否是自己的属性和方法,是的话打印,原型的属性就不打印。
if (obj.hasOwnProperty(prop))
console.log(obj[prop]);
}
//只打印name和num
in
in 只能判断这个属性到底可不可以被这个对 象访问到,并不能判断这个属性属不属于这个对象。
例:"height" in obj 得到 true
(属性是字符串形式的,必须 加上引号,不加会报错的)
( in 基本不用,但是考试有时候会考到)
instanceof : 判断是否为构造方法的属性
a instanceof b:看 A 对象的原型链上有没有 B 的原型。
例:
[] instanceof Array ->true
[] instanceof Object ->true
思考:如何判断一个变量是数组还是对象。
- 方法一:arr.constructor,如果返回 function Array(){}就是数组,返回 function Object(){}就是对象。
- 方法二:arr instanceof Array,如果返回 true 就是数组,返回 false 就是对象。
- 方法三(无BUG,推荐):调用 Object.prototype.toString.call(arr),数组返回"[object Array]", 对象返回"[object Object]"
克隆对象
//遍历对象 for(var prop in obj)
//1.判断是不是原始值 typeof()-->object,
若不是object,基本就是原始值(可以是null)
//2.判断是数组还是对象 toString(推荐)、instanceof、constructor
//3.建立相应的数组或对象
//4.递归
//深度克隆对象的方法(被克隆对象,克隆对象)
function deepClone(origin, target) {
var target = target || {},
toStr = Object.prototype.toString,
arrStr = "[object Array]";
for (var prop in origin) {
if (origin.hasOwnProperty(prop)) {
if (origin[prop] !== null && typeof(origin[prop]) == 'object') {
if (toStr.call(origin[prop]) == arrStr) {
target[prop] = [];
} else {
target[prop] = {};
}
deepClone(origin[prop], target[prop]);
} else {
target[prop] = origin[prop]
}
}
}
return target;
}
//使用
var a = deepClone(obj);
deppClone(obj,a);
//浅克隆:同地址,你改我也改
var obj = {name : "du" }
var obj1 = {}
for(var prop in obj){
obj1[prop] = obj{prop}
}