JavaScript的原型与原型链是什么,有何关系?

Admin 2022-01-14 群英技术资讯 414 次浏览

    这篇文章给大家分享的是JavaScript的原型与原型链的内容,原型和原型链是JavaScript中的难点,同时也是比较难理解的。对此这篇就给大家来详细的讲讲,相信对大家明白原型与原型链是什么,以及它们的关系等等都有帮助,接下来就跟随小编一起了解看看吧。

    先知道对应关系

prototype:原型
__proto__:原型链(链接点)

  • 从属关系

    • prototype : 函数的一个属性 -> 不要想的太复杂,其实就是一个普通对象{}
    • __proto__ : 对象上的一个属性 -> 不要想的太复杂,其实就是一个普通对象{}
  • 对象的__proto__保存着对象的构造函数的prototype

  • 函数是特殊对象 所以__proto__在函数上也是存在的,且是个function

    大家经常忽略忘记的一点:Object是个方法(构造函数),new Object是个实例对象!!!

console.log(Object) //typeof Object ==='function'
console.log(new Object) //typeof new Object ==='object'

    constructor

    constructor就是实例化对象的构造函数

//test.constructor -> 实例化test对象的构造函数 Test
console.log(test.constructor===Test) //true

//这里个人理解为永无止境的自身调用自身,求解,没找到相关文章。
console.log(test.constructor.prototype.constructor===Test) //true
console.log(test.constructor.prototype.constructor.prototype.constructor===Test) //true
//constructor允许更改
function Test2() {
    this.a=123
}
test.constructor=Test2
console.log(test)

    原型

function Test(){}
let test=new Test() //new完之后 test是个实例对象了
console.log(test.__proto__===Test.prototype) //根据上面的对应关系表 可以知道结果为true
//Test.prototype也是一个对象,所以他必须也得有__proto__
//Test.prototype.__proto__已经到达终点了,终点是什么,终点就是Object构造函数,所以下面结果为ture
console.log(Test.prototype.__proto__.constructor===Object)
//且 按照上面对应关系中的规则和上条的结果,下条结果也是ture
console.log(Test.prototype.__proto__===Object.prototype) // 
//终点为null
console.log(Object.prototype.__proto__) //null

    能不能描述一下原型链

    对象的__proto__保存着对象的构造函数的prototypeprototype又是个对象,所以也有自己的__proto__,这样往复到终点Object.__proto__,这样就形成了一个以__proto__为链接点(为key)值为构造方法的prototype对象的一根链条, 即为原型链。

//__proto__
test{
      b:333,
      a:1,
      __proto__:Test.prototype={
          c:222,
          b:2,
          __proto__:Object.prototype={
              c:3,
              __proto__:null
          }
      }
 }

    特殊的函数对象

    重点:JS中,函数是一种特殊的对象!!!

    记住文章开头的对应关系表

//函数是特殊对象 所以__proto__是存在的,且是个function
console.log(Test.__proto__) //function
console.log(Test.prototype) //object

    Test既然是个函数,那么底层必然也是new Function实现的,那么

//对象的__proto__保存着对象的构造函数的prototype
console.log(Test.__proto__===Function.prototype) //true 这里是不是和关系表对应上了,能正常理解

const obj={}
const obj2=new Object()

console.log(Object) //function
console.log(typeof Object) //'function'

    Function既然是个构造函数,那么他是不是也应该有__proto__prototype,是的,但是这里有一个特殊的点需要记住。

    底层规则规定 :Function.__proto__===Function.prototype是相等的,且两者返回的都是一个function,我的理解是Function自己构造了自己。

//正常来说函数的Test.prototype应该是个object,
//Function.prototype是个function,这也是一个特殊的点
typeof Test.prototype==='object' //true

console.log(Function.__proto__) // 一个function
console.log(Function.prototype) // 一个function
//Function既然是函数对象_,那么他的_proto__就指向他的构造函数的prototype,也就是
//Function.__proto__===Function.prototype,自己调自己,这样理解是不是也没毛病。
console.log(Function.__proto__===Function.prototype) //true

//Object既然是个构造方法,那么底层也是new Function
console.log(Object.__proto__===Function.prototype) //true

// 因为Function.__proto__===Function.prototype 所以下面代码是成立的
(Object.__proto__===Function.__proto__)===true

    hasOwnProperty和in

    hasOwnProperty

    hasOwnProperty用来判断是否是对象自身的属性(非原型链继承过来的)

let test={
    a:1,
    b:2
}
Object.prototype.c=3
console.log(test.hasOwnProperty('a')) //true
console.log(test.hasOwnProperty('b')) //true
console.log(test.hasOwnProperty('c')) //false

    in

    in用来检查对象是是否包含某个属性(包含原型链上的属性)

console.log('a' in test) //true
console.log('b' in test) //true
console.log('c' in test) //true
console.log('toString' in test) //true
console.log('d' in test) //false

    现在大家对于JavaScript的原型与原型链应该都有所了解了吧,希望大家阅读完这篇文章能有所收获。最后,想要了解更多JavaScript的原型与原型链的内容,大家可以关注群英网络其它相关文章。

文本转载自PHP中文网

群英智防CDN,智能加速解决方案

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。

猜你喜欢

成为群英会员,开启智能安全云计算之旅

立即注册
专业资深工程师驻守
7X24小时快速响应
一站式无忧技术支持
免费备案服务
免费拨打  400-678-4567
免费拨打  400-678-4567 免费拨打 400-678-4567 或 0668-2555555
在线客服
微信公众号
返回顶部
返回顶部 返回顶部
在线客服
在线客服