对象 Object
对象是一个整体,从语法角度就是一个无序属性的集合。
对象由特征和行为组成,特征在程序中通过属性描述。
- 行为用函数描述
- 可以动态添加成员
1 创建对象
1.1 使用Object构造函数
const obj = new Object();
obj.a = 1;
obj.b = 2;
const obj = {
a:1,
b:2
};
1.2 构造函数使用new运算符创建新的对象
class Person {
constructor(name) {
this.name = name;
}
}
const jane = new Person('jane');
const joe = new Person('joe');;
const alex = new Person('alex');;
1.3 Object.create
方法
可以创建一个以另一个对象作为原型的对象
const bar = {
a:1
}
const foo = Object.create(bar);
foo.b = 1;
foo.c = 2;
如果我们记录该foo对象,则会得到foo
的__proto__
属性具有a其值设置为1的属性。
如果要创建没有原型的对象,则可以Object.create
使用参数调用该方法,null以便__proto__
不设置该属性。
const foo = Object.create(null);
foo.b = 1;
foo.c = 2;
如果我们记录的值foo,我们将看到它没有__proto__
属性。
2 对象调用
1、对象名.属性名
2、对象名[‘属性名’]
3、对象名[变量名]
示例:
//定义对象
var lisi = {
name: "lisi", // 属性名:属性值 k:v
age: 33,
xueli: "benke",
birthday: {
year: 1988,
month: 9,
day: 10
},
teach: function() { // 方法
console.log("带大家月薪破30K");
}
}
// 对象调用
// 对象.成员
console.log(typeof lisi);
console.log(lisi.age);
console.log(lisi['age']);
console.log(lisi.birthday.month);
//lisi.teach();
//teach(); 有错,对象里面的方法不能直接调用
var attr = 'xueli';
console.log(lisi.xueli);
console.log(lisi['xueli']);
console.log(lisi[attr]); // attr是变量 只能用中括号
console.log(lisi.attr); // undefined
// 对象可以动态添加成员
lisi.wx = 'zxl7621485';
lisi.sing = function() {
console.log('singing');
}
console.log(lisi);
3 检查对象中是否存在某个属性
第一种使用 in
操作符号:
const o = {
"prop" : "spider",
"prop2" : "man"
};
console.log("prop" in o); // true
console.log("prop1" in o); // false
第二种使用 hasOwnProperty
方法,hasOwnProperty()
方法会返回一个布尔值,指示对象自身属性中是否具有指定的属性(也就是,是否有指定的键)。
console.log(o.hasOwnProperty("prop2")); // true
console.log(o.hasOwnProperty("prop1")); // false
第三种使用括号符号obj["prop"]
。如果属性存在,它将返回该属性的值,否则将返回undefined
。
console.log(o["prop"]); // "spider"
console.log(o["prop1"]); // undefined
4 in
运算符和 Object.hasOwnProperty
方法有什么区别
hasOwnPropert
方法
hasOwnPropert()
方法返回值是一个布尔值,指示对象自身属性中是否具有指定的属性,因此这个方法会忽略掉那些从原型链上继承到的属性。
看下面的例子:
Object.prototype.phone= '15345025546';
let obj = {
name: '前端',
age: '28'
}
console.log(obj.hasOwnProperty('phone')) // false
console.log(obj.hasOwnProperty('name')) // true
可以看到,如果在函数原型上定义一个变量phone
,hasOwnProperty
方法会直接忽略掉。
in 运算符
如果指定的属性在指定的对象或其原型链中,则in
运算符返回true
。
还是用上面的例子来演示:
console.log('phone' in obj) // true
可以看到in
运算符会检查它或者其原型链是否包含具有指定名称的属性。
5 使用for in
遍历对象和使用Object.keys
来遍历对象 有什么区别?
for in
主要用于遍历对象的可枚举属性,包括自有属性、继承自原型的属性。Object.keys
返回一个数组,元素均为对象自有的可枚举属性。Object.getOwnProperty
用于返回对象的自有属性,包括可枚举的和不可枚举的 。
var obj = {
"name":"xiaosan",
"age":23
}
Object.defineProperty(obj,"height",{value:178,enumerable:false})
Object.prototype.prototypel = function(){
console.log('aaa')
}
Object.prototype.prototype2 = 'bbb';
//for in
for(var i in obj){
console.log(i); //name age prototypel prototype2
}
//Object.keys
console.log(Object.keys(obj)) // [ 'name', 'age' ]
//Object.getOwnProperty
console.log(Object.getOwnPropertyNames(obj)) //name age height