javascript 对象的创建

143 阅读3分钟

javascript 对象的创建及 属性

什么对象?:是一组没有特定顺序的值,对象的每个属性或方法都有一个名字,每个名字都映射到一个值。

对象的属性类型

ECMAScript 有两种属性:

  1. 数据属性
    1. configurable 表示能否通过delete 删除
    2. writable 表示能否修改属性的值
    3. enumerable 表示能否通过for-in 遍历返回属性
    4. value 包含这个属性的数据值
  2. 访问器属性 不包含数据值
    1. configurable
    2. enumerable
    3. get
    4. set

修改属性默认的特性,必须使用Object.defineProperty()方法。方法接收三个参数

属性所在的对象,属性的名字,一个描述符对象

# 数据属性有四个 
const obj = {
  name: "pig",
  age: 14,
};

Object.defineProperty(obj, "name",  {
  writable: false,
  value: 42
});

console.log(obj);  // { name: 42, age: 14 }

创建对象的方式有哪些?

  1. 对象字面量
    1. 使用同一个接口创建多个对象时,会产生很多的重复代码
  2. new 操作符 + Object 创建对象
    1. 使用同一个接口创建多个对象时,会产生很多的重复代码
  3. 工厂模式
    1. 解决上面两个创建方式的缺点,
    2. 但是没有解决对象识别的问题
  4. 构造函数模式
    1. 没有显示的创建对象
    2. 直接将属性和方法赋给了this对象
    3. 没有return 语句
  5. 原型模式
    1. 所有对象实例共享它的属性和方法
    2. 实例自己的属性(方法)(即所谓的私有属性),可以覆盖原型对象上的同名属性(方法)。
  6. 构造模式+原型模式
    1. 构造函数模式 用来定义实列属性,原型模式用于定义方法和共享的属性。
    2. 支持向构造函数传参数

原型对象

只要创建了一个新函数,就会根据特定的一组规则为该函数创建一个prototype属性,这个属性指向函数的原型对象。

默认情况下,原型对象会自动获得一个constructor构造函数属性,这个属性指向prototype属性所在函数的指针。

通过 isPrototypeOf()方法来确定对象之间是否存在这种关系

通过 hasOwnProperty()方法可以检测一个属性是存在实列中,还是原型中,只要给定的属性存在对象实列中时,返回true.

in 操作符 会在通过对象能够访问给定属性时,返回true,不管该属性时在原型中还是实列中。

结合hasOwnProperty() 和 in 操作符,来判断属性存在原型中还是实列中

function sum (){}
undefined
sum.prototype // {constructor: ƒ}
sum.constructor // ƒ Function() { [native code] }
sum.prototype.constructor // ƒ sum (){}

# 结合 hasOwnProperty() 和 in 操作符,来判断属性是存在原型中还是实列中
function hasPtototypeProperty(obj,name){ 
  return !obj.hasOwnProperty(name) && (name in obj)
}

获取对象属性,分可枚举,和不可枚举

for in 返回的是所有能够通过对象访问的,可枚举的属性,包含存在实列中的属性,也包含了原型中的属性。

可枚举 使用 Object.keys(obj),返回包含可枚举属性的字符串数组。

Object.getOwnPropertyNames()获取所有实列属性,会包含不可枚举的属性 constructor

本文使用 👉mdnice 排版