new 运算符详解

当使用 new 运算符执行一个函数时,称为构造函数执行模式,返回一个实例对象,而函数体中的this指向这个实例

如何实现?
  • 创建一个对象
  • 将对象原型指向构造函数的原型
  • 将this指向这个对象
  • 返回这个对象
// 实现 new
function fakeNew(){
	const obj = {}
	// 获取构造函数
	const _constructor = [].shift.call(arguments)
	// 改变原型指向
	Object.setPrototypeOf(obj, _constructor.prototype)
	// 改变this指向
	const result = _constructor.apply(obj, arguments)
	// 返回对象
	return typeof result === 'object' ? result : obj
}
// 例
function Person(name, age) {
	this.name = name;
	this.age = age
}
const person1 = new Person('Kevin', 28)
const person2 = fakeNew(Person, 'Jhon', 29)
融会贯通
function Fn(n) {
	let m = 10;
	this.total = n + m;
	this.say = function() {
		console.log(this.total)
	}
}
const f1 = new Fn(10)
const f2 = new Fn(20)
const f3 = new Fn // new 不管是否加(),都相当于执行函数,只是没有参数
console.log(f1.m) // undefined 私有变量和实例没有关系
console.log(f2.n) // undefined 私有变量和实例没有关系
f2.say() // 30 此时 this 指向f2
console.log(f1 === f2) // false
console.log(f3) // Fn {total: NaN, say: ƒ}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值