js手写一个new

 在写new方法之前,我们应该先理解原型是什么?

比如:有2个对象,对象A和对象B,我希望对象A能用对象B的所有属性,这个时候就可以通过对象私有属性__proto__指向对象B,对象B就是对象A的原型

const B = {
  c: 2,
  d: 4
}
const A ={
  a: 1,
  b: 3
}
// 如果B作为A的原型
A.__proto__ = B  // 尽量用Object.setPrototypeOf(A, B)去设置,该操作不规范

console.log(A) 

打印A结果如下:

对象A属性[[Prototype]]即对象B,对象B属性[[Prototype]]即Object.prototype,Object.prototype没有属性[[Prototype]],所以Object.prototype的原型为null 

构造函数在原型方面的作用: 

 通过构造函数创建的每一个实例都会自动将构造函数的 prototype 属性作为其 [[Prototype]]。 

 手写New方法:

function myNew(constructor, ...args) {
  // 创建一个新的空对象,并将其原型链接到构造函数的原型对象
  const obj = {}
  Object.setPrototypeOf(obj, constructor.prototype)
  // 直接用 const obj = Object.create(constructor.prototype); 可以代替上面操作
  console.log(obj); // {}
  // 将构造函数内部的 this 指向这个新对象
  const result = constructor.apply(obj, args);
  console.log(result, 'result'); // undefined
  console.log(obj, 'obj'); // { name: 'Alice', age: 30 }
  // 如果构造函数返回的是对象,则直接返回该对象
  if (result && (typeof result === 'object')) {
    return result;
  }
  // 否则返回这个新对象
  return obj;
}

// 示例构造函数
function Person(name, age) {
  this.name = name;
  this.age = age;
}
Person.prototype.getName = function() {
  return this.name
}

// 使用自定义的 myNew 方法创建对象实例
const person1 = myNew(Person, 'Alice', 30);
person1.getName() // 'Alice'

constructor.apply(obj, args)

  这一步,将构造函数 Person 内部的 this 指向了新创建的对象 obj,并执行构造函数内部的代码。

   由于构造函数 Person 中使用了 this.name = name; 和 this.age = age; 来初始化属性,因此在这个过程中,obj 对象的属性被成功设置为 { name: 'Alice', age: 30 }。

   result 输出 undefined,这是因为构造函数 Person 没有显式返回值,所以默认返回值是 undefined。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值