2021-04-27

对象

JavaScript对象的特征
JavaScript的基本数据类型,一种复合值,可看做是属性的无序集合。
每个属性都是一个名/值对。
属性名是字符串,因此可以把对象看成是从字符串到值得映射。
对象除了可以保持自有的属性,还可以从一个称为原型的对象继承属性。
原型式继承(prototypal inheritance)是JavaScript的核心特征。
对象是动态的,可以增加或删除属性。
除了字符串、数值、true、false、null和undefined,其他值都是对象。

创建对象
对象字面量是一个表达式,每次运算都会创建一个新的对象,其中的属性值也会重新计算。如:

let empty = {}; //没有任何属性的对象
let point = { x: 0, y: 0 }; //具有属性的对象
let book = {
  //属性名中有空格,必须用字符串表示。
  "main title": "JavaScript",
  //属性名中有特殊字符,必须用字符串表示
  "sub-title": "The Definitive Gruide", 
  //属性名可以是保留字,但尽量避免。
  for: "all audiences", 
  //属性值可以是一个对象。  
  author: {
    firstname: "David",
    lastname: "Flanagan",
  },
};

通过new创建对象
通过new调用构造函数(constructor)来创建并初始化一个新对象。
JavaScript语言核心中的原始类型都包含内置构造函数,如Object()、Array()、Date()等。

原型
所有内置构造函数都具有一个继承自Object.prototype的原型。
如:Array.prototype的属性继承自Object.prototype。
通过层级的原型继承形成的链接,称为“原型链”(prototype chain)。

let obj = { value: 100 };
Object.prototype.flag = "head";
console.log(obj.flag);
let arr = [1, 2, 3, 4];
console.log(arr.flag);

Object.create( )

// obj1继承了属性x和y。
let obj1 = Object.create({ x: 1, y: 2 });
//obj2不继承任何属性和方法。
let obj2 = Object.create(null);
//obj3是一个普通的空对象。
let obj3 = Object.create(Object.prototype);

继承

对象除了可以保持自有的属性,还可以从一个称为原型的对象继承属性。
原型式继承(prototypal inheritance)是JavaScript的核心特征。
原型继承链

let a = {};
a.x = 1;
let b = inherit(a);
b.y = 2;
let c = inherit(b);
c.z = 3;
console.log(c.toString());
console.log(c.x + c.y + c.z);

每个属性还有一些与之相关的值,称为“属性特征(property abttribute)”。
可写(writable attribute),表明是否可以设置属性的值。
可枚举(enumerable attribute),表明是否可以通过for/in结构返回该属性。
可配置(configurable attribute),表明是否可以删除或修改该属性。
Object.keys(),它返回一个数组,这个数组由对象中可枚举的自有属性的名称组成。
Object.getOwnPropertyNames(),它和Ojbect.keys()类似,只是它返回对象的所有自有属性的名称,而不仅仅是可枚举的属性。

let p = Object.defineProperties(
  {},
  {
    x: { value: 1, writable: true, enumerable: true, configurable: true },
    y: { value: 1, writable: true, enumerable: true, configurable: true },
    r: {
      get: function () {
        return Math.hypot(this.x, this.y);
      },
      enumerable: true,
      configurable: true,
    },
  }
);

属性访问错误

查询一个不存在的属性并不会报错,如果在对象o自身的属性或继承的属性中均未找到属性x,属性访问表达式o.x返回undefined。
但是,如果对象不存在,那么试图查询这个不存在的对象的属性就会报错。
在这些场景下给对象o设置属性p会失败:
o中的属性p是只读的:不能给只读属性重新赋值(defineProperty()方法中有一个例外,可以对可配置的只读属性重新赋值)。
o中的属性p是继承属性,且它是只读的:不能通过同名自有属性覆盖只读的继承属性。
o中不存在自有属性p:o没有使用setter方法继承属性p,并且o的可扩展性(extensible attribute)是false。如果o中不存在p,而且没有setter方法可供调用,则p一定会添加至o中。但如果o不是可扩展的,那么在o中不能定义新属性。

属性getter和setter
对象属性是由名字、值和一组特性(attribute)构成的。
在ECMAScript 5中,属性值可以用一个或两个方法替代,这两个方法就是getter和setter。
由getter和setter定义的属性称做“存取器属性”(accessor property),它不同于“数据属性”(data property),数据属性只有一个简单的值。
当程序查询存取器属性的值时,JavaScript调用getter方法(无参数)。
这个方法的返回值就是属性存取表达式的值。
当程序设置一个存取器属性的值时,JavaScript调用setter方法,将赋值表达式右侧的值当做参数传入setter。
从某种意义上讲,这个方法负责“设置”属性值。可以忽略setter方法的返回值。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值