JavaScript的原型和原型链是什么,有何关系?
发布时间:2022-02-08 15:30:44 所属栏目:编程 来源:互联网
导读:这篇文章给大家分享的是JavaScript的原型与原型链的内容,原型和原型链是JavaScript中的难点,同时也是比较难理解的。对此这篇就给大家来详细的讲讲,相信对大家明白原型与原型链是什么,以及它们的关系等等都有帮助,接下来就跟随小编一起了解看看吧。 先知
这篇文章给大家分享的是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__保存着对象的构造函数的prototype,prototype又是个对象,所以也有自己的__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 (编辑:宿州站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |