likes
comments
collection
share

因为错误理解原型并发出而被大家吊锤的经历

作者站长头像
站长
· 阅读数 3

跨年前一天,我在头脑不清晰,对原型理解不深刻的情况下发了一篇号称指出红宝书错误的文章,结果小丑竟是我自己

红宝书第四版第234页 因为错误理解原型并发出而被大家吊锤的经历

红宝书是这样写的

 function Person(){}
    Person.prototype = {
        name:'zhaoxi'
    }
    
 let friend = new Person()
console.log(friend instanceof Person);  //1  true
 console.log(friend instanceof Object );  //2  true
 console.log(friend.constructor ==Person)  //3  false 
 console.log(friend.constructor ==Object)  //4  true 

俺是这样写的

 function Person(){
    Person.prototype = {
        name:'zhaoxi'
    }
  }
  
   let friend = new Person()
console.log(friend instanceof Person);  //1  false
 console.log(friend instanceof Object );  //2  true
 console.log(friend.constructor ==Person)  //3  true  
 console.log(friend.constructor ==Object)  //4  false

这两种写法会产生非常大的差异,具体的原理暂时我还不能明明白白的解答,只是感谢大家指出我的错误,感谢下面的这些掘友,在发现有问题之后,依然坚持看完,并且给出自己的理解。

发文章前自己要先做好考证工作,不然很容易误导别人

兄弟,你对js的原型机制误解有些偏差,建议再重新理一下。我最近也在温故红宝书。

作者贴的代码不全,很容易一起误解。先不论文章对与错,就说一下这两种结果: 在new一个实例之后再进行prototype赋值操作,确实会有文章最后的那个结果。 而在new一个实例之前去赋值,则与其他评论的结果一致。而看文章那个聊天的图片中的代码,将prototype赋值放在构造函数中,是和上述第一种情况一致的

结论确实有误,可能是你在比对的时候没有按照人家的顺序,然后看岔了。勇气可嘉,相信后面会对这个地方的知识点印象更加深刻。

因为错误理解原型并发出而被大家吊锤的经历

原型链和原型和构造器麻烦再看看

但凡手写过instanceOf,详细了解过原型链的人,都不会点赞

红宝书让你了解js可以做什么,这些案例内容是为了有助于对概念的体验,在此处费时间得不偿失。而且这两年js技术变化太大了,多家参考才能学好了。

如果没理解错你的意思,那你原型链那块需要好好补补 PS: 暂时没电脑,解释你这里,还得让你明白,手机打字太累

麻烦对你文章里代码块部分的markdown修改一下,你现在这完全是乱的

1,”红宝书上说通过 Person.prototype = { name:'zhaoxi' } 这种方式给原型添加属性“,你文章开头这句话对红宝书的理解就错了,书中说的这种方法就是覆写了Person函数的原型,而不是什么给原型添加属性。 2,instandof确实是基于__proto__和propertype(即原型链)的,详细可以参照下面这张图; 3, function Person(){ let a = Person.prototype.constructor //第一个构造函数是自己 Person.prototype = { name:'zhaoxi' } } let friend = new Person() console.log(friend instanceof Person); 这段代码本就该输出false,你可以测试一下,但你却写了输出true并标注了错误 4,你最后说的那些奇怪现象本来就不奇怪 因为错误理解原型并发出而被大家吊锤的经历

大哥,你这个还是运行一下吧,原型和原型链好好的再看看吧

自己运行一下吧 因为错误理解原型并发出而被大家吊锤的经历

不仅对原形和原形链的理解是错的,甚至连 new也没懂

完全就是错的,你真的有测试过你的代码吗,还是想当然的理解?

prototype 也只是一个的对象罢,创建新对象只不过仅仅把原来的 prototype 替换掉了,而新的对象中并没有默认 constructor 属性,所以才会丢失,如果你想避免,在对象中添加 constructor:Person就好,现在的 Person.prototype 上并没有 constructor,但是Person.prototype.proto 上有,function Object创造的的,constructor 指向 Object,所以 Person.constructor 自然指向Object,所以 Person.prototype === Object 为 true,还有 instanceof 是查找整个原型链,而不是说查找最近的原型

抱着对红皮书的信任我直接翻到了最后看你的结论。好家伙,friend就是用Person new出来的,怎么可能friend instanceof Person为false。new的时候本来就有返回对象的__proto__=Person.prototype的操作。还有friend.construct,friend没这个属性,就是从原型上取的,就是Person.prototype.construct,很显然这里因为被从新赋值了字面量对象,Person.prototype.construct直接等于信字面量对象,他也没有construct,又从他的原型里面找construct,找到Object。你这结论四句里面有三句是错的。当然中间太长我没看,直接看的结论,如果有什么我看漏了请无视

prototype 也只是一个的对象罢,创建新对象只不过仅仅把原来的 prototype 替换掉了,而新的对象中并没有默认 constructor 属性,所以才会丢失,如果你想避免,在对象中添加 constructor:Person就好,现在的 Person.prototype 上并没有 constructor,但是Person.prototype.proto 上有,function Object创造的的,constructor 指向 Object,所以 Person.constructor 自然指向Object,所以 Person.prototype === Object 为 true,还有 instanceof 是查找整个原型链,而不是说查找最近的原型

Person.prototype === Object写错了,是 Person.constructor === Object 为 true

我会记住大家的批评和鼓励

感谢以上的所有人,希望大家新年愉快