JavaScript中的原型和原型链怎么理解(javascript,web开发)

时间:2024-04-28 14:13:26 作者 : 石家庄SEO 分类 : web开发
  • TAG :

JavaScript中的原型和原型链怎么理解

先知道对应关系

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

  • 从属关系

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

    • __proto__ : 对象上的一个属性 -> 不要想的太复杂,其实就是一个普通对象{}

  • 对象的__proto__保存着对象的构造函数的prototype

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

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

console.log(Object)//typeofObject==='function'console.log(newObject)//typeofnewObject==='object'

constructor

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

//test.constructor->实例化test对象的构造函数Testconsole.log(test.constructor===Test)//true//这里个人理解为永无止境的自身调用自身,求解,没找到相关文章。console.log(test.constructor.prototype.constructor===Test)//trueconsole.log(test.constructor.prototype.constructor.prototype.constructor===Test)//true//constructor允许更改functionTest2(){this.a=123}test.constructor=Test2console.log(test)

原型

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

JavaScript中的原型和原型链怎么理解

能不能描述一下原型链

对象的__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}}}

JavaScript中的原型和原型链怎么理解

特殊的函数对象

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

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

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

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

//对象的__proto__保存着对象的构造函数的prototypeconsole.log(Test.__proto__===Function.prototype)//true这里是不是和关系表对应上了,能正常理解constobj={}constobj2=newObject()console.log(Object)//functionconsole.log(typeofObject)//'function'

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

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

//正常来说函数的Test.prototype应该是个object,//Function.prototype是个function,这也是一个特殊的点typeofTest.prototype==='object'//trueconsole.log(Function.__proto__)//一个functionconsole.log(Function.prototype)//一个function//Function既然是函数对象_,那么他的_proto__就指向他的构造函数的prototype,也就是//Function.__proto__===Function.prototype,自己调自己,这样理解是不是也没毛病。console.log(Function.__proto__===Function.prototype)//true//Object既然是个构造方法,那么底层也是newFunctionconsole.log(Object.__proto__===Function.prototype)//true//因为Function.__proto__===Function.prototype所以下面代码是成立的(Object.__proto__===Function.__proto__)===true

hasOwnProperty和in

hasOwnProperty

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

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

in

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

console.log('a'intest)//trueconsole.log('b'intest)//trueconsole.log('c'intest)//trueconsole.log('toString'intest)//trueconsole.log('d'intest)//false
 </div> <div class="zixun-tj-product adv-bottom"></div> </div> </div> <div class="prve-next-news">
本文:JavaScript中的原型和原型链怎么理解的详细内容,希望对您有所帮助,信息来源于网络。
上一篇:php如何将字节数组转16进制下一篇:

9 人围观 / 0 条评论 ↓快速评论↓

(必须)

(必须,保密)

阿狸1 阿狸2 阿狸3 阿狸4 阿狸5 阿狸6 阿狸7 阿狸8 阿狸9 阿狸10 阿狸11 阿狸12 阿狸13 阿狸14 阿狸15 阿狸16 阿狸17 阿狸18