【js大师之路】说明了javascript的原型对象和原型链实例
通过原型解决了多个实例的方法共享问题。接下来,我们将了解原型和原型链的起源和发展。
函数CreateObj(uName){ this . username=uName;} createobj . prototype . show username=function(){ return this . username;} var obj 1=new CreateObj(' ghost Wu ');var obj 2=new create obj(' Wei Zhang ');
1,每个函数都有一个prototype属性(prototype),它是构造函数的prototype对象(CreateObj.prototype)的指针,如上图第一条绿线所示
2.默认情况下,所有原型对象都将自动获得一个构造函数属性。这个属性的功能已经在上面解释过了。该属性包含一个指向原型属性的函数,例如上图中的第二条绿线
3.所有实例(从构造函数new、原型对象(比如CreateObj.prototype,我还没有画出来)等。)包含隐式原型(_ _ prototype _),它指向实例构造函数的原型对象。
在上图中,第3行和第4行的构造函数。obj1是createobj,CreateObj的原型对象,CreateObj。原型,和obj2是一样的,所以:
obj1。_ _ proto _ _===CreateObj . prototype//true
obj2。_ _ proto _ _===createobj . prototype//true
4.在构造函数中编写为其赋值的属性和方法。在绘制过程中,将它们绘制在对象上。例如,userName是一个为对象赋值的属性,因此obj1和obj2上都有一个userName属性。
5.写在原型对象上的方法或属性应该绘制在原型对象上,例如
createobj . prototype . show username=function(){ return this . username;}方法}showUserName应该绘制在图中的CreateObj.prototype上
6.当对象访问属性和方法时,调用其访问规则(邻近原则),规则如下:
当实例上有属性或方法时,直接使用实例上的属性和方法,
如果实例上没有属性和方法,它将继续沿着实例的__proto__指针所指向的原型对象进行查找。如果找不到,则该值未定义。
console . log(obj 1 . show username());//ghosttwuconsole . log(obj 2 . show username());Wei Zhaung中obj1和obj2上没有showUserName方法,所以CreateObj.prototype原型对象上的showUserName方法会沿着__proto__找到。
如果CreateObj.prototype对象上的showUserName被注释掉,那么obj1.showUserName和obj2.showUserName将报告一个错误
//createobj . prototype . show username=function(){//返回this.userName//}函数create obj(uName){ this . username=uName;this . showusername=function(){ return ' 100 ';} } createobj . prototype . show username=function(){ return this . username;} var obj 1=new CreateObj(' ghost Wu ');var obj 2=new create obj(' Wei Zhang ');console . log(obj 1 . show username());//100 console . log(obj 2 . show username());//100如果在构造函数中为此添加了一个showUserName方法,obj1和obj2将直接调用这个方法,因为这两个方法将在图中的实例上绘制,所以:
console . log(obj 1 . show username===obj 2 . show username);//false现在,在构造函数的原型对象上编写属性和方法后,应该能够理解多个实例的属性和方法共享的原理。
什么是原型链?
前面我说过所有实例(包括原型对象)都有一个隐式原型__proto__,那么原型对象CreateObj.prototype指向谁呢?
函数CreateObj(uName){ this . username=uName;this . showusername=function(){ return ' 100 ';} } createobj . prototype . show username=function(){ return this . username;} console . log(CreateObj . prototype . _ _ proto _ _);//指向object . prototype console . log(createobj . prototype . proto _ _==object . prototype);//真
CreateObj.prototype.__proto__指向Object.prototype,通过同余运算符(===)测试后为真
Object.prototype. _ _ proto _ _指向空值
这是原型链。有些构造函数是通过隐式原型一层一层串在一起的。从上图中,我们可以知道为什么自定义对象可以调用toString、valueOf等方法。
因为所有对象都是从对象继承的。
以上【js大师之路】举例说明了javascript的原型对象,原型链示例就是边肖分享的全部内容。希望能给大家一个参考,支持我们。
版权声明:【js大师之路】说明了javascript的原型对象和原型链实例是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。