美文网首页
绕来绕去的prototype,__proto__,constru

绕来绕去的prototype,__proto__,constru

作者: SherHoooo | 来源:发表于2017-01-31 16:47 被阅读0次

今天发现自己又搞不明白prototypeprotoconstructor这些属性直接的区别了。。故此总结一下O_0·

function Person() {
    this.category = 'human'
}

function Female() {
    this.sex = 'female'
}

Female.prototype = new Person()
var xia = new Female()
var chinese = new Person()

以上例子中,有两个类,Person类,和Female类,Female类的prototype属性为Person类的一个实例,而xia和chinese则分别是Female类和Person类的实例

prototype

表示对象的原型。

xia.prototype // undefined
Female.prototype // Person {category: 'human'}
Person.prototype // Object {contructor: person(), __proto__: Object}

_proto_

xia.__proto__ // Person {category: 'human'}
Female.__proto__ // function () {}
Person.__proto__ // function () {}

出现这种情况的主要原因是以下两点:
1. 所有构造器/函数的都指向Function.prototype,它是一个空函数(Empty function)
2. 所有对象的proto都指向其构造器的prototype,即 chinese.constructor.prototype === chinese.__proto__

由上可知,xia.__proto__ === xia.constructor.prototype,而xia.constructor这里为啥等于Person函数嘞?看下面的constructor的讲解


constructor

xia.constructor // function Person() {this.category = 'human'}

constructor始终指向创建当前对象的构造(初始化)函数。
任何一个prototype对象都有一个constructor属性,指向它的构造函数。
每一个实例也有一个constructor属性,默认调用prototype对象的constructor属性。即xia.constructor === Female.prototype.constructor
每个函数都有一个默认的属性prototype,而这个prototype的constructor默认指向这个函数

正常情况下,xia.constructor即是Female.prototype,应该指向其构造函数,也就是Female(),但是由于之前将Female.prototype指向了Person类的实例,即Person {category: 'human'},故
xia.constructor === Female.prototype === chinese.constructor === function Person () {}
这样看来,是很不好的,导致继承链的紊乱(xia明明是用构造函数Female生成的),因此我们必须手动纠正,将Female.prototype对象的constructor值改为Female.prototype.constructor = Female
这是很重要的一点,编程时务必要遵守。下文都遵循这一点,即如果替换了prototype对象,那么,下一步必然是为新的prototype对象加上constructor属性,并将这个属性指回原来的构造函数。

相关文章

  • 绕来绕去的prototype,__proto__,constru

    今天发现自己又搞不明白prototype、proto、constructor这些属性直接的区别了。。故此总结一下O...

  • 绕来绕去

    想清楚

  • 绕来绕去

    一个不用微信一年多的朋友突然开始玩微信了,第一想法是这是一个有故事的人。 其实每个人都有自己的故事,只是这个故事会...

  • 绕来绕去

    我躺着就想你 热热乎乎胸膛 黏黏搭搭汗渍 腻腻歪歪缠绕 干干净净离去

  • 绕来绕去的事儿

    “蟋蟀在堂,岁聿其莫。”还有6天8月就晃完了,天气一凉,晚上就听不到蛐蛐儿叫了,好似到了岁暮。傍晚通知,可以有序下...

  • 绕来绕去,绕不开,我爱你。

    雨后,天气凉爽了许多,苏和南风在公园散步。湿答答的地面,苏很喜欢,喜爱两边墨绿的苔藓。 苏突然扭过头来问南...

  • 绕来绕去绕回来

    想当初,不想做全职妈妈的一个原因就是觉得,我很需要价值感,但我知道把自己的价值感寄托在孩子身上是很可怕的事情。 所...

  • 前端

    * __proto__和prototype 每个对象都有__proto__,但只有函数有prototype。当你创...

  • javascript 原型链图

    __proto__和 prototype __proto__是对象才有的属性prototype 是函数才有的属性

  • 隐式原型<画图>

    prototype === __proto__ Function.prototype === Function._...

网友评论

      本文标题:绕来绕去的prototype,__proto__,constru

      本文链接:https://www.haomeiwen.com/subject/tblkittx.html