typescript之prototype

本文通过代码示例详细解析JavaScript中的原型(prototype)和实例方法的调用规则。当对象实例拥有同名方法时,优先执行实例上的方法;若不存在,则查找原型链。同时,直接在实例上覆盖原型方法将导致原型方法无法调用。此外,通过`__proto__`可访问原型对象,但其`this`指向会导致某些方法无法正常工作。最后,直接在构造函数上定义的方法与实例无关,只能在构造函数上调用。
摘要由CSDN通过智能技术生成

参考

https://www.runoob.com/js/js-object-prototype.html

直接代码说话吧:

function person() {}
person.prototype.test = function () {
  console.log(this.a)
}

let per1 = new person()
per1.a = '456'
per1.test()   // 456
person.prototype.test() //undefined

per1.test = function () {
  console.log('123')
}
per1.test()  //123
per1.prototype.test() //TypeError: Cannot read property 'test' of undefined



通过上面代码可以看出:

1、当对象实例可以有test函数的时候,就执行当前的test函数 。如果找不到的话,就去prototype上面去找。

2、在对象实例上面无法直接调用prototype对象

per1.__proto__

另外我们可以看下person对象在运行时候的堆栈信息。

第一个test 应该是当前实例上的函数,第二个test是prototype上面的test函数。

per1.__proto__.test()   //undefined

上述的方法也可以调用prototype上面的test对象,但是获取不到this.a的值,这个应该是当前的this指向了__proto__对象了。

这里还有一种用法,如下:

person.test2 = function () {
  console.log('test2')
}
person.test2() //test2
per1.test2()   //TypeError: per1.test2 is not a function

这种用法的话,那么test2函数和我们实例的对象就完全没有关系了。只可以在person函数上面调用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值