对象与继承

60 阅读1分钟

对象

创建对象的方式

Object.create()

  1. 通过Object.create() 创建出来的对象其 原型链指向了引用的类型
    const obj = {}
    const bar = Object.create(obj)
    bar.__proto__ === obj

const obj = {} 字面量方式创建

    const obj = {}
    obj.__proto__ === Object.prototype

new 方式创建

   function Person(name) {
       this.name = name
   }
   Person.prototype.getName = function(){
       console.log(this.name)
   }
   const p = new Person('张三')
   p.getName()  // 张三
   
   // 对象的原型链指向构造函数的原型
   console.log(p.__proto__ === Person.prototype)
   // 构造函数的原型指向了函数本身
   console.log(Person.prototype.constructor === Person)
   console.log(p.__proto__.constructor === Person)
new 的执行过程
  1. 创建了一个空对象
  2. 将空对象的原型链指向函数的原型
  3. 指向函数并将this指向改为对象
  4. 返回 4.1 如果当前函数有返回值且返回值为对象则正常返回 4.2 如果当前函数有返回值且返回值不是对象则返回当前对象 4.3 如果当前函数无返回值则返回当前对象
function Person(name) {
   this.name = name
}
Person.prototype.getName = function(){
   console.log(this.name)
}

function newObj(fn) {
    if(typeof fn !== 'function'){
        console.log('the first param is not a function')
        return
    }
    let obj = {}
    obj.__proto__ = fn.prototype
    const res = fn.apply(obj, Array.prototype.slice.call(arguments, 1))
    return typeof res === 'object' && res !== null ? res : obj
}

const obj = newObj(Person, '张三')
console.log(obj.__proto__ === Person.prototype)
console.log(Person.prototype.constructor === Person)
console.log(obj.__proto__.constructor === Person)

继承