美文网首页
js原型和继承

js原型和继承

作者: 小伙儿_0c3c | 来源:发表于2018-03-01 17:04 被阅读0次

    说到原型就不得不说构造函数,js一切皆对象,但分为普通对象和函数对象,构造函数就属于函数对象,所谓的原型和继承也是在函数对象下实现的

    了解原型与原型链需要知道的三个构造函数属性(prototype, __proto__, constructor)

    1. prototype、__proto__

    prototype:原型是函数类型对象的一个自带属性'prototype',这个属性其实也是一个对象,有自己的属性和方法,通过原型可以实现对象的属性继承,null和undefined没有原型和原型链。

    __proto__: “prototype”作为对象的内部属性,是不能被直接访问的,Firefox和Chrome中提供了__proto__这个非标准(不是所有浏览器都支持)       的访问器(ECMA引入了标准对象原型访问器”Object.getPrototype(object)”)。

    对象的原型链

    那么一个对象的[[prototype]]属性究竟怎么决定呢?这是由构造该对象的方法决定的。据我所知有三种构造一个对象的方法:

    然而虽然说[[prototype]]是一个隐藏属性,但很多浏览器都给每一个对象提供.__proto__这一属性,这个属性就是上文反复提到的该对象的[[prototype]]。由于这个属性不标准,因此一般不提倡使用。ES5中用Object.getPrototypeOf函数获得一个对象的[[prototype]]。ES6中,使用Object.setPrototypeOf可以直接修改一个对象的[[prototype]]

    2. 在JavaScript的原型对象中,还包含一个”constructor”属性,这个属性对应当前对象原型的实例的构造函数。

    object.constructor指向object的构造函数,而构造函数的constructor指向的也是自己本身,所以object.constructor.constructor........。最后还是指向的是object的构造函数本身,

    constructor属性不影响任何JavaScript的内部属性。instanceof检测对象的原型链,通常你是无法修改的(不过某些引擎通过私有的__proto__属性暴露出来)。constructor其实没有什么用处,只是JavaScript语言设计的历史遗留物。由于constructor属性是可以变更的,所以未必真的指向对象的构造函数,只是一个提示。不过,从编程习惯上,我们应该尽量让对象的constructor指向其构造函数,以维持这个惯例。

    相关文章

      网友评论

          本文标题:js原型和继承

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