JavaScript 如何实现一个 new

1 new Object()创建

先定义一个构造函数,并定义构造函数的原型方法

var Dog = function (name,age) {
    this.name = name;
    this.age = age;
}
Dog.prototype.bark = function () {
    console.log("wang wang")
}
Dog.prototype.sayName = function () {
    console.log("my name is:"+this.name+" age:"+this.age);
}
let erha = new Dog('二哈',2)
erha.bark()
erha.sayName()

// new 的作用
// 创建一个新对象 obj
// 把obj的__proto__指向Dog.prototype 实现继承
// 执行构造函数,传递参数,改变this指向  Dog.call(obj,...args)
// 最后把obj的值传回 给jinmao

var _new = function () {
    // console.log(arguments)  // [Arguments] { '0': [Function: Dog], '1': 'jinmao', '2': 1 }
    let construct = Array.prototype.shift.call(arguments); // [Function: Dog]
    let args = arguments;// [Arguments] { '0': 'jinmao', '1': 1 }
    const obj = new Object()
    obj.__proto__ = construct.prototype;
    construct.call(obj,...args);
    return obj;

}

var jinmao = _new(Dog,'jinmao',1);
jinmao.bark()
jinmao.sayName()
console.log(jinmao instanceof Dog)

// wang wang
// my name is:二哈 age:2
// wang wang
// my name is:jinmao age:1
// true

2 Object.create()创建

Object.create()介绍

var Dog = function (name,age) {
    this.name = name;
    this.age = age;
}
Dog.prototype.bark = function () {
    console.log("wang wang")
}
Dog.prototype.sayName = function () {
    console.log("my name is:"+this.name+" age:"+this.age);
}
let erha = new Dog('二哈',2)
erha.bark()
erha.sayName()


function _new1(fn,...args) {
    const obj = Object.create(fn.prototype)
    const ret = fn.call(obj,...args);
    return ret instanceof Object ?ret:obj;
}

var jinmao = _new1(Dog,'jinmao',1);
jinmao.bark()
jinmao.sayName()
console.log(jinmao instanceof Dog)

// wang wang
// my name is:二哈 age:2
// wang wang
// my name is:jinmao age:1
// true

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值