zoukankan      html  css  js  c++  java
  • 手写 new

    /*
      基于内置的 new 关键词,我们可以创建 Dog 的一个实例 zhangsan ,实例可以调用原型上的属性和方法
      需求:自己实现一个 _new 方法,也可以模拟出内置 new 后的结果
    */

    /*
      let zhangsan = new Dog('张三');
       1、像普通函数执行一样,形成一个私有的作用域
         形参赋值
         变量提升
       2、默认创建一个对象,让函数中的 this 执行这个对象,这个对象就是当前类的一个实例
       3、代码执行
       4、默认把创建的对象返回
    */
    function Dog(name) {
      this.name = name;
    }
    Dog.prototype.bark = function () {
      console.log('hello!');
    }
    Dog.prototype.sayName = function () {
      console.log('my name is ' + this.name);
    }
    // => Fn 当前要 new 的类 =>Dog
    // => arg 后期需要给构造函数传递的参数信息 =>['张三']
     
    function _new(Fn, ...arg) {
    // => 创建一个空对象,让他的原型链指向 Fn.prototype (作为 Fn 的一个实例)
    // => Object.create([AA对象]) -> 创建一个空对象 obj ,并且让空对象 obj 作为 AA对象 所属构造函数的实例(obj.__proto__=AA)
    // let obj = {};
    // obj.__proto__ = Fn.prototype;
      let obj = Object.create(Fn.prototype);
      Fn.call(obj, ...arg);
      return obj;
    }
    let zhangsan = _new(Dog, '张三');
    zhangsan.bark();
    zhangsan.sayName();
    console.log(zhangsan instanceof Dog);
  • 相关阅读:
    团队第一阶段冲刺评价
    冲刺(十)
    冲刺(九)
    冲刺(八)
    冲刺(七)
    冲刺阶段(12)
    冲刺阶段(11)
    与市面APP的对比
    团队绩效管理
    第一阶段意见汇总
  • 原文地址:https://www.cnblogs.com/HYTing/p/12620673.html
Copyright © 2011-2022 走看看