JS实现一个new

实现一个new
代码如下:

var Dog = function(name) {
  this.name = name;
}
Dog.prototype.bark = function() {
  console.log('wang');
}
Dog.prototype.sayName = function() {
  console.log('my name is', this.name);
}

var xiaobai = new Dog('小白');
xiaobai.sayName();
xiaobai.bark();

//实现new
var _new = function() {
  var constructor = Array.prototype.shift.call(arguments);  //Dog
  var args = arguments;
  const obj = new Object();
  obj.__proto__ = constructor.prototype;
  constructor.call(obj, ...args);
  return obj;
}

var xiaohei = _new(Dog, '小黑');
xiaohei.bark();
xiaohei.sayName();

console.log(xiaohei instanceof Dog);    //true

解析

  1. 思路:
    • 创建一个新对象obj
    • 把obj的__proto__指向Dog.prototype实现继承
    • 执行构造函数,传递参数,改变this指向,Dog.call(obj, …args)
    • 返回obj
  2. 解析:
    • var constructor = Array.prototype.shift.call(arguments); //Dog
      _new()的第一个参数是Dog,arguments返回的是_new的实参,因此constructor为Dog
    • var args = arguments; 获取剩下的参数
    • const obj = new Object(); 新建对象
    • obj.proto = constructor.prototype; 把新建对象的__proto__指向Dog的原型链上
    • constructor.call(obj, …args);传递参数,改变this指向

执行结果

  • console.log(Dog.prototype);
    在这里插入图片描述
  • console.log(xiaobai);
    在这里插入图片描述
  • console.log(xiaohei);
    在这里插入图片描述
  • console.log(xiaohei instanceof Dog); true
    instanceof运算符用于测试构造函数的prototype属性是否出现在对象的原型链中的任何位置
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值