javascripe理解对象

   现实生活中,每一个人都是一个对象。对象有它的属性,如身高和体重,方法有走路或跑步等;所有人都有这些属性,但是每个人的属性都不尽相同,每个人都拥有这些方法,但是方法被执行的时间都不尽相同 ,本文将从一下方面理解对象。

  • 对象的创建
  • 对象的访问
  • 新增、删除对象中的属性
  • Obje原型属性及方法详解
  • 检测属性
  • 数据属性
  • 检测属性

1、对象的创建

  • 第一种:字面量模式

定义:对象使用"{}"作为对象的边界,对象是由多个属性组成,属性与属性之间通过","隔开,属性名与属性值通过":"隔开;属性名一般不添加引号(当属性名中出现特殊字符的时候需要添加引号),属性值如果是字符串的一定添加引号。

var person = {
  name: 'zhangsan',
  age: 19,
  gender: '男',
  sayName: function () {
    console.log(this.name); //方法中的this指向当前对象
  }
}
  • 第二种:构造函数模式

定义:使用Object或者使用自定义构造函数来初始化对象

var person2 = new Object()
person2.name = 'larry'
person2.age = 18
person2.gender = '男'
person2.sayName = function () {
  console.log(this.name);
}
console.log(person2)

对象的访问

  • 访问对象中的属性

第一种:点语法  对象名.属性名   例:person.name

点后面直接跟的是对象的属性,如果属性存在可以访问到,如果属性不存在,得到undefined

第二种:中括号  对象名['属性名']    例:person['name']

  • 访问对象中的方法  对象名.方法名()    例:person.sayName()
var person = {
  name: 'zhangsan',
  age: 19,
  gender: '男',
  sayName: function () {
    console.log(this.name); //方法中的this指向当前对象
  }
}
// 点语法
console.log(person.name);
// 中括号
console.log(person['age']);
person.sayName()

新增、删除、修改对象中的属性

新增:对象名.新的属性名=值

删除:delete 对象名.属性名 /  delete 对象名['属性名'] /delete 对象名.方法名

注意:删除只能删除对象的自有属性

(以字面量模式创建的 person为例)

// 3.2删除对象属性——delete
delete person.age
console.log(person);

// 3.3新增属性 实例对象名称.新增对象属性 / 直接赋值
person.height = 1.78
console.log(person);

//3.4 修改
person.name = 'lisi'
console.log(person);

Object原型属性及方法详解

定义:

  1. 每个构造函数都有一个原型对象,原型对象都包含一个指向构造函数的指针,实例都包含一个指向原型对象的内部指针。
  2. 在Object的构造函数的原型对象中的属性和方法都可以被Object构造函数的实例所继承
  3. Object原型中的所具有的任何属性和方法也同样存在于其他对象中,任何对象继承自Object

指针关系:

  1. 构造函数中有prototype指向——>原型对象
  2. 原型对象中有constructor指向——>构造函数
  3. 实例对象中有_proto_指向——>原型对象

图解:

 

Object原型中常用的方法

使用方法:实例对象名.xx方法()

  1. constructor ——保存用户创建当前对象的函数,与原型对象对应的构造函数

  2. hasOwnProperty(propertyName)——检查给定的属性名是否是对象的自有属性

  3. propertyIsEnumerable(propertyName)——检查给定的属性在当前对象实例中是否存在

  4. valueOf()——返回对象的字符串,数值,布尔值的表示

  5. toLocaleString()——返回对象的字符串表示,该字符串与执行环境的地区对应

  6. toString()——返回对象的字符串表示

  7. isPrototypeOf(object)——检查传入的对象的原型

// 使用构造函数创建实例对象
var obj = new Object()

// 调用原型对象中继承的方法
console.log(obj.toString());
console.log(obj.__proto__.toString());

// 构造函数 Object
console.log(Object);  //[Function: Object]
// 原型对象 Object.prototype
console.log(Object.prototype);  // {}
// 原型对象中的constructor属性  原型对象中的constructor属性指向构造函数
console.log(Object.prototype.constructor);  //[Function: Object]
// 实例__proto__ 指向 原型对象
console.log(obj.__proto__ === Object.prototype);  //true

检测一个属性是否属于某个对象方法

注意:Object.prototype.xxxx说明该方法是原型对象中的方法,可以实例对象名.xxxx调用

  • 第一种:in   检测某属性是否是某对象的自有属性或者是继承属性
    • 语法:‘属性名’in 对象名
    • var obj = {
        name: 'zhansan',
        age: 19,
        gender: '男'
      }
      
      // 1、in 检测自身或继承属性
      console.log('name' in obj); //true
      console.log('toString' in obj); //true
  • 第二种:Object.prototype.hasOwnProperty()  检测是否为自身属性,继承为false
    • var obj = {
        name: 'zhansan',
        age: 19,
        gender: '男'
      }
      console.log(obj.hasOwnProperty('name')); //true
      console.log(obj.hasOwnProperty('toString')); //false
  • 第三种:Object.prototype.propertyIsEnumerable()  除了是自身属性外,还要求是可枚举属性,即我们创建的属性。
    • var obj = {
        name: 'zhansan',
        age: 19,
        gender: '男'
      }
      console.log(obj.propertyIsEnumerable('name')); //true
      console.log(obj.propertyIsEnumerable('toString')); //false

深入理解对象:

ECMAScript中有两种属性:数据属性、访问器属性。这两种属性用于设置属性的高级属性,例如该属性是否可以配置,是否可以读写,是否可以遍历,并且可以通过setter,getter来监听数据的改变。

1、数据属性

例如person.name =‘zhangsan’这属性,我们可以进行设置 name是否可修改、是否可删除、

是否可遍历,当我们对象新增一个数据属性时,后台会默认Configurable 、Enumerable 、Writable 都为true。我们可以通过Object.defineProperty( )手动修改以上的三个属性

  • Configurable  设置属性是否可以被delete删除掉、在数据属性中默认为true、在访问器属性中默认为false
  • Enumerable 控制是否可以被forin循环遍历出来(默认取值同上)

  • Writable 控制属性值是否可以被修改(默认取值同上)

  • value 属性值

2、Object.defineProperty()方法

作用:定义新属性或修改原有属性

语法:

注意:当我们创建一个对象并且为对象设置一个属性的时候,该属性默认特性Configurable、Enumerable、Writable默认都为true,value为该属性的值。

例子:

var person = {
  name: 'zhangsan'
}
// 2、使用defineProperty  添加一个新属性并控制属性特性或修改已有属性的属性特性
Object.defineProperty(person, 'age', {
  // 设置是否可以被delete删除掉
  configurable: false,
  // 是否可以被forin循环遍历出来
  enumerable: true,
  // 是否可以修改值
  writable: false,
  // 值
  value: 20
})
// 假设删除
delete person.age
console.log(person.age);
// for-in循环
for (var key in person) {
  console.log(key);
}
// 假设修改值
person.age = '12'
console.log(person.age);

3、Object.defineProperties()方法

作用:定义多个新属性

语法:

 例子:

var person = {
  name: 'zhangsan'
}
Object.defineProperties(person, {
  // 身高
  height: {
    configurable: true,
    value: 1.80
  },
  // 性别
  gender: {
    value: '男'
  }
})
console.log(person.height);
console.log(person.gender);
console.log(person);

4、访问器属性

访问器属性:这个属性不包含数据值,包含的是一对get和set方法,在读写访问器属性时,就是通过这两个方法来进行操作处理的

四个特性:

  1. Configurable:设置属性是否可以被delete删除掉

  2. Enumerable:控制是否可以被for-in循环遍历出来(默认取值同上)

  3. get:获取属性触发的方法(点语法时触发)

  4. set:在写入属性时调用的函数(新增或修改时触发)

注意:

  1. 访问器属性:访问器属性不包含数值,它包含的是一对getter和setter函数

  2. 访问器属性不能直接定义,要通过Object.defineProperty()这个方法来定义。

例子:访问器属性中Object.defineProperty()方法的使用

var person = {
  // 使用“_”看成内部属性
  _birthDay: 2000,
  age: 1
}
// 新增一个访问属性(birthDay) 根据一个值的变化动态改变另外一个值
Object.defineProperty(person, 'birthDay', {
  // 获取值
  get: function () {
    console.log(this);
    return this._birthDay


  },
  // 设置值
  set: function (newValue) {
    if (newValue != this._birthDay) {
      this._birthDay = newValue
      // console.log(this); //this指向person  因为get set 是person对象的内部函数

    }
  }
})
person.birthDay = 2001
console.log(person._birthDay);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值