对象

156 阅读2分钟

创建方式

// 字面量创建
var obj = {};
​
// 内置构造函数创建
var obj = new Object();
​
// 使用工厂函数创建对象
function createObj(name, age, gender) {
    let obj ={};
    
    obj.name = name;
    obj.age = age;
    obj.gender = gender;
    
    return obj;
}
​
let obj1 = createObj();
​
// 自定义构造函数创建
// 1、自己书写一个构造函数
// 2、使用构造函数创建对象
function createObj(name, age, gender) {    
    this.name = name;
    this.age = age;
    this.gender = gender;
}
​
let obj1 = new createObj('jack', 18, '男');

原型/原型对象(prototype)

// 定义:每一个函数天生自带一个属性叫做 prototype,它是一个对象
// 属性: constructor  表示该原型对象是哪一个构造函数伴生的
// 作用:就是为了书写一些方法给该构造函数的实例对象使用// 向 prototype 上添加一些属性和方法
function person() {
    Person.prototype.sayHi = function() {
        console.log('hello world');
    }
}

proto

// 定义:每一个对象天生自带一个属性,叫做 __proto__,指向所属构造函数的 prototype
// 实例化对象也是一个对象
// 实例化对象也有 __proto__ 属性

对象访问机制

// 当访问一个对象成员的时候,如果对象本身有,则直接返回结果,停止查询;
// 如果对象本身没有,就会自动去 __proto__ 上访问,有就返回结果,停止查询;
// 没有的话,再去 __proto__ 上找,一直找到定级对象的 __proto__,都没有则返回undefined// 每一个函数天生自带一个属性叫做 prototype,是一个对象
// 每一个对象天生自带一个属性叫做 __proto__ 指向所属构造函数的prototype
// 每一个对象,没有准确的构造函数来实例化的时候,我们都看做是内置构造函数 Object 的实例

原型链

// 任何一个对象出发,按照 __proto__ 开始向上查找,
// 最终都鞥找到 Object.prototype,我们把这个使用 __proto__ 串联起来的对象链状结构,叫做原型链
// 原型链的作用:为对象访问机制服务

constructor(构造器)

  • 只有函数天生自带的那个 prototype 上才有
  • 表示是哪一个构造函数所自带的 原型对象
  • 作用:判断复杂数据类型
  • 例如:console.log([].constructor === Array)

判断数据类型

  • typeof

    • 准确判断基本数据类型
    • 对于复杂数据类型并不准确
    • 例:console.log(typeof '123')
  • constructor

    • 利用原型的属性
    • 利用对象访问机制
    • 例:console.log([].constructor)
  • instanceof

    • 语法:对象 instanceof 构造函数
    • 检测基本数据类型不方便
    • 例:console.log({} instanceof Object)
  • Object.prototype.toString.call()

    • 语法:Object.prototype.toString.call(需要检测的数据)
    • 例:console.log(Object.prototype.toString.call(123))