• Ctor -> constructor缩写 构造函数
  • params -> 后期给Ctor传递的所有的实参信息

    new干了那些事?

  1. 创建 实例对象
  2. 把构造函数当做普通函数执行
    1. 主要是要让方法中的THIS->实例对象
  3. 确认方法执行的返回值
    1. 如果没有返回值或者返回的是原始值,我们让其默认返回实例对象即可…
  • Object.create( [obj] )创建一个空对象,并且让空对象.proto指向[obj]
    • 把[obj]作为新实例对象的原型
    • [obj] 可以是一个对象或者是null,但是不能是其他的值
    • Object.create(null) 创建一个不具备proto属性的对象「不是任何类的实例」
    • 实例:obj = Object.create(Ctor.prototype);
      • 创建一个Ctor的空对象,并把proto指向Ctor的prototype ```javascript function Dog(name) { this.name = name; } Dog.prototype.bark = function () { console.log(‘wangwang’); } Dog.prototype.sayName = function () { console.log(‘my name is ‘ + this.name); }

function new(Ctor, …params) { // 1.创建Ctor的一个实例对象 // 实例.proto===Ctor.prototype let obj = {}; obj._proto = Ctor.prototype;

// 2.把构造函数当做普通函数执行「让方法中的THIS->实例对象」 let result = Ctor.call(obj, …params);

// 3.确认方法执行的返回值「如果没有返回值或者返回的是原始值,我们让其默认返回实例对象即可…」 if (result !== null && /^(object|function)$/.test(typeof result)) return result; return obj; }

let sanmao = _new(Dog, ‘三毛’); sanmao.bark(); //=>”wangwang” sanmao.sayName(); //=>”my name is 三毛” console.log(sanmao instanceof Dog); //=> true

  1. <a name="bhoc0"></a>
  2. ### 多几个校验
  3. ```javascript
  4. function _new(Ctor, ...params) {
  5. let obj,
  6. result,
  7. proto = Ctor.prototype, // 构造函数要有原型
  8. ct = typeof Ctor;
  9. // 校验规则
  10. if (Ctor === Symbol || Ctor === BigInt || ct !== 'function' || !proto) {
  11. throw new TypeError(`${Ctor} is not a constuctor!`);
  12. }
  13. obj = Object.create(Ctor.prototype);
  14. result = Ctor.call(obj, ...params);
  15. if (result !== null && /^(object|function)$/.test(typeof result)) return result;
  16. return obj;
  17. }
  18. let sanmao = _new(Dog, '三毛');
  19. sanmao.bark(); //=>"wangwang"
  20. sanmao.sayName(); //=>"my name is 三毛"
  21. console.log(sanmao instanceof Dog); //=>true

自己写Object.create

  1. Object.create = function create(prototype) {
  2. if (prototype !== null && typeof prototype !== "object") {
  3. throw new TypeError('Object prototype may only be an Object or null');
  4. }
  5. var Proxy = function Proxy() {}
  6. Proxy.prototype = prototype; // 原型设置
  7. return new Proxy; // 创造一个空对象
  8. };