一个关于删除prototype上的属性的问题

Damn_boy 2018-08-07 11:19:36
代码如下

function Foo(){

};


Foo.prototype.log = function(text){
console.log(text)
};


var foo = Foo ? new Foo() : {}

foo.log('before delete');

//Foo.prototype = { } 这句执行完毕以后,log方法依然会存在与foo对象上,并且可以调用

delete Foo.prototype.log; //这句可以正常删除log方法

foo.log('after delete');



foo上的__proto__不是一个指向Foo.prototype上的引用吗?任何Foo.prototype上的修改都会即可映射到foo上,拿为什么delete可以生效,直接将prototype赋值为{}却不能?
...全文
412 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
漠子凉 2018-08-08
  • 打赏
  • 举报
回复
直接{}是值改变
delete是引用改变
Hello World, 2018-08-07
  • 打赏
  • 举报
回复 1
实际上你用Foo.prototype = { }和用delete Foo.prototype.log;都是有改变的,但使用Foo.prototype={}会断开联系,用delete则是修改原型。


尽管可以随时为原型添加属性和方法,并且修改能够立即在所有对象实例中反映出来,但如果是重写整个原型对象,那就不一样了。
调用 构造函数时会为实例添加一个指向最初原型的指针,而把原型修改为另外一个对象就等于切断了构造函数与最初原型之间的联系。

实例中的指针仅指向原型,而不指向构造函数。
風灬雲 2018-08-07
  • 打赏
  • 举报
回复
一个是删除原型中的属性,删除后实例还是构造函数的实例,
一个是改变原型指向,改变后实例就不属于构造函数的实例了,重新再new一个实例的话是没有log这个方法的

87,919

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 JavaScript
社区管理员
  • JavaScript
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧