如何实现一个new方法

2022-10-25 14:14:18 浏览数 (4)

es5没有类的概念,使用function模拟类,使用大概如下

代码语言:javascript复制
  function Parent(name,age){
      this.name=name;
      this.age=age;
  }
  Parent.prototype.say=function(){
      console.log('你好' this.name);
  }
  var child=new Parent('星辰',18)
  child.say()

当我们new一个构造器,主要有三步:

• 创建一个空对象,将它的引用赋给 this,继承函数的原型。 • 通过 this 将属性和方法添加至这个对象 • 最后返回 this 指向的新对象,也就是实例(如果没有手动返回其他的对象)

代码语言:javascript复制
// ES5构造函数
let Parent = function (name, age) {
    //1.创建一个新对象,赋予this,这一步是隐性的,
    // let this = {};
    //2.给this指向的对象赋予构造属性
    this.name = name;
    this.age = age;
    //3.如果没有手动返回对象,则默认返回this指向的这个对象,也是隐性的
    // return this;
};
const child = new Parent();

new 关键字大概 是使用构造函数的原型创建一个对象,然后调用构造函数初始化属性,最后根据构造函数返回值决定返回什么 • 以构造器的prototype属性为原型,创建新对象; • 将this(也就是上一句中的新对象)和调用参数传给构造器,执行; • 如果构造器没有手动返回对象,则返回第一步创建的新对象,如果有,则舍弃掉第一步创建的新对象,返回手动return的对象。

代码语言:javascript复制
   function Parent(name,age){
       this.name=name;
       this.age=age;
   }
   Parent.prototype.say=function(){
       console.log('你好' this.name);
   }
   function newNew(c,...res){
    //使用构造函数原型对象创建空对象,继承原型方法
    var obj=Object.create(c.prototype);
    // 调用父类,初始化属性
    var result=c.apply(obj,res);
    // 执行构造函数,若是返回一个新对象,new就会返回这个新对象,否则返回obj
    return typeof result==='object'?result:obj;
   }

   var child=new Parent('星辰',18)
   child.say()

0 人点赞