构造函数

179 阅读2分钟

这是我参与8月更文挑战的第24天,活动详情查看:8月更文挑战

####构造函数执行 new

构造函数执行就是创建自定义类和类所对应的实例的

  • 像普通函数执行一样,把函数执行,并且私有上下文和形参赋值等都操作一遍
  • 在形成私有上下文之后,首先默认会创建一个对象(实例对象)
  • 让当前上下文中的this 指向创建的这个对象
  • 接下来代码执行过程中所有的this.xxx = xxx 都是给实例对象设置私有的属性和方法
  • 代码执行完成后,看是否有返回值,没有返回值迷人返回创建的实例对象,如果有返回值,如果返回基本类型值,那么返回的还是实例对象,如果返回的是引用类型值,以自己返回的为主
  • 因为构造函数执行既有普通函数执行的一面,也有特殊的一面,所以在所属私有上下文中,只有this.xxx = xxx才跟实例有关系

var f1 = new Func(); var f2 = new Func;

区别

  • 不写括号传不了实参

  • 运算优先级问题 Func()优先级是19,Func优先级18

  • new Func().say() 先创建实例,再去调用.say() 执行

  • new Func.say() 先成员访问获取到Func.say()的值,最后再把获取的值new一下

检测当前实例是否属于这个类

f1 instancsof Func 检测某个对象是否具备这个属性 in ,是否为私有属性 hasOwnProperty

console.log('say' in f1); console.log(f1.hasOwnProperty('say'));

Object.create(xxx);创建一个空对象,并且把xxx 作为创建对象的原型(空对象. proto ),XXX 必须是对象或者null,如果xxx 是null,则创建一个没有任何原型指向的空对象

Func 创造一个类的实例
剩余的参数都是给Func 这个函数传递的实参以数组形势存在args里面
function _new (Func,...args){
    let obj = {}
    obj.__proto__ = Func.prototype // IE 中不能使用__proto__
    // Object.create(xxx) 创建一个空对象,并且会把xxx作为当前对象的原型链指向
    let obj = Object.create(Func.prototype);  //不兼容低版本浏览器
    
    let result  = Func.call(obj,...args);
    
    if(result == null || !/^(object|function)$/.test(typeof result)) return obj;
    return result
}

重写Object.create

重写Object.create   创建某个类的空实例

Object.create = function create(prototype){
    
    function Func(){}
    Func.prototype = prototype;
    return new Func();
}