Published on

你不知道的JavaScript读书笔记上(第一部分)

Authors
  • avatar
    Name
    谢克成
    Twitter

第二部分 this 和对象原型

关于 this

1.1 为什么要用 this

this 可以指代一个对象

对象

语法

定义对象的语法有两种形式,声明形式和构造形式

// 声明形式:
var myObj = {
  name: 'jack',
  age: 18,
}

// 构造形式
var myObj = new Object()
myObj.name = 'jack'
myObj.age = 18

类型

对象是 JavaScript 的基础,在 JavaScript 中一共有六种主要类型

  • string
  • number
  • boolean
  • null
  • undefined
  • object

内置对象

  • String
  • Number
  • Boolean
  • Object
  • Function
  • Array
  • Date
  • RegExp
  • Error

内容

在对象中,属性名永远是字符串,如果使用 string(字面量)以外的其他值作为属性名,他会自动转换成一个字符串

复制对象

浅拷贝

使用 Object.asign 实现浅拷贝

const aObj = {
  name: 'jack',
  age: 18,
}

const clone = Object.assign({ desc: '我是喵喵' }, aObj)
console.log(clone)
// { desc: '我是喵喵', name: 'jack', age: 18 }

使用 ...拓展运算符实现浅拷贝

const aObj = {
  name: 'jack',
  age: 18,
}
const clone = { hobby: '睡觉', ...aObj }
console.log(clone)
// { hobby: '睡觉', name: 'jack', age: 18 }

不变性

有时你会希望属性或者对象是不可改变的,在 ES5 可以通过多种方式来实现。

很重要的一点是,所有的方法创建的都是浅不变形,也就是说,它们只会影响目标对象和 它的直接属性。如果目标对象引用了其他对象(数组、对象、函数,等),其他对象的内 容不受影响,仍然是可变的:

1. 对象常量

使用 writeable:false 和 configurble:false 可以创建一个真正的常量属性,不可修改,不可配置

var obj = {}
Object.asign(obj, 'favorite_number', {
  value: 13,
  writable: false,
  configurable: false,
})

2. 禁止拓展

使用 Object.preventExtensions(...) 可以禁止一个对象添加新属性并保留已有属性

var obj = {
  name: 'jack',
}
// 保留原有属性,禁止拓展属性
Object.preventExtensions(obj)
obj.age = 33
console.log(obj)
// { name: 'jack' }

3. 密封

Object.seal(...)会创建一个‘密封’的对象,这个方法实际上是会调用 Object.preventExtensions,并把所有属性标记为 configurable:false,被密封之后,不能添加新属性,也不能重新配置或删除任何现有属性(但是可以修改属性的值)

4. 冻结

Object.freeze(..) 会创建一个冻结对象,这个方法实际上会在一个现有对象上调用 Object.seal(..) 并把所有“数据访问”属性标记为 writable:false,这样就无法修改它们的值。