对象概念解析、操作

对象 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

可以看到,如果在函数原型上定义一个变量phonehasOwnProperty方法会直接忽略掉。

in 运算符

如果指定的属性在指定的对象或其原型链中,则in 运算符返回true

还是用上面的例子来演示:

console.log('phone' in obj) // true

可以看到in运算符会检查它或者其原型链是否包含具有指定名称的属性。

5 使用for in遍历对象和使用Object.keys来遍历对象 有什么区别?

  1. for in 主要用于遍历对象的可枚举属性,包括自有属性、继承自原型的属性。
  2. Object.keys 返回一个数组,元素均为对象自有的可枚举属性。
  3. 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值