欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  web前端

原型、原型链 的相关内容讲解

程序员文章站 2022-04-18 12:13:19
...

原型、原型链 的相关内容讲解



原型、原型链 的相关内容讲解

这里prototype表示系统自带的属性,第一句话表示设置了Person的祖先有一个属性Lastname,后面创建person和person1

属性的时候就会继承这个属性值


原型、原型链 的相关内容讲解

一个小的例子表示继承的关系

prototype可以将一些对象共有的东西致只写一遍,不同每次都创建一遍



原型、原型链 的相关内容讲解

此外,还可以把原型封装起来,这样会更好



原型、原型链 的相关内容讲解

上个例子中的constructor是一个系统自带的属性(叫做构造器),他是从prototype继承过来的,并且这个属性是可以更改的,它的内容是构造函数我们可以看一下

原型、原型链 的相关内容讲解

浅紫色的代表系统自带的

原型、原型链 的相关内容讲解

而另一个属性__proto__的内容是prototype的内容(两个__是隐式命名规则)

原型、原型链 的相关内容讲解一般在开发中如果你不想让同事访问或者改变一个参数,那么就会想这样命名一个参数,js中没有绝对的private


原型、原型链 的相关内容讲解

这里是一个修改__proto__的例子,这样ff就可以访问person.prototype里面的值了

原型、原型链 的相关内容讲解



原型、原型链 的相关内容讲解

这里访问Person.name依然会是sunny,因为这个例子就好像

原型、原型链 的相关内容讲解

虽然改变了整个prototype的结构,但是在第二次改变为cherry之前,已经原型、原型链 的相关内容讲解

也就是在被new的时候this{}里面的值就会返回给person,然后再改变成cherry的时候就不会被影响了,所以这压力要考虑执行顺序。

但是如果改变函数语句顺序:

原型、原型链 的相关内容讲解

那么person.name就会变成cherry,因为执行顺序变了

但是如果是原型、原型链 的相关内容讲解这样来修改,就能修改成功了



原型链

原型、原型链 的相关内容讲解

这是一个原型链,通过prototype这个结点链接,这样的话,son就能访问到lastname,然后其实Grand上面还有一个原型,有一个Grand.prototype=object object是所有原型链的终端



原型、原型链 的相关内容讲解

原型、原型链 的相关内容讲解

原型、原型链 的相关内容讲解

原型、原型链 的相关内容讲解

因为new是person的,所以this{}返回给person,

person.__proto__链接的是Person.prototype,所以不变(也就是说Person.prototype除了直接修改,都变不了



原型、原型链 的相关内容讲解

原型、原型链 的相关内容讲解

Person不能直接访问sayName



Object.create(原型):

原型、原型链 的相关内容讲解

这样的话就能访问到Person中的prototype,但是不能访问到age这个内部数据

原型、原型链 的相关内容讲解

原型、原型链 的相关内容讲解

这样是能都访问到的:

原型、原型链 的相关内容讲解



之前有一句话叫:绝大多数对象最终都谁继承自Object.prototype

但是并不是所有对象都是继承自它的,因为存在以下例外:

原型、原型链 的相关内容讲解

这样的的话:

原型、原型链 的相关内容讲解

obj里面就没有__proto__了

如果手动给他加上__proto__:

原型、原型链 的相关内容讲解

但是这样的话

原型、原型链 的相关内容讲解

就找不到obj.name了,要访问这个数据只能:

原型、原型链 的相关内容讲解


/*************************************************************************************************************/

拓展:

toString()方法:

toString()方法是Object.prototype里面自带的,所以绝大数对象都会有这个方法(除了undefined和null)

原型、原型链 的相关内容讲解

这两个不能通过包装类来继承Object的原型,所以访问不了。

原型、原型链 的相关内容讲解

数字只能这样访问,而不能:

原型、原型链 的相关内容讲解

因为数字里面的‘.’优先级很高,系统会把它认为是小数点(浮点类型),所以会报错

而布尔类型就能直接这样

原型、原型链 的相关内容讲解


我们再来详细解析一下:

原型、原型链 的相关内容讲解

num.toString()就会出现包装类:

原型、原型链 的相关内容讲解

而其实Number的原型里面有一个重写的toString()方法:

原型、原型链 的相关内容讲解

而根据原型链,Number的原型里面的__proto__会继承Object的原型:

原型、原型链 的相关内容讲解

所以当调用num.toString()方法时会一级一级往上,先调用Number里的这个函数原型


再来实战:

原型、原型链 的相关内容讲解

原型、原型链 的相关内容讲解

这里调用的肯定是:

原型、原型链 的相关内容讲解

这里从object.prototype继承过来的toString方法,如果我想要截断它:

原型、原型链 的相关内容讲解

只需要重写这个方法就行了

结果:

原型、原型链 的相关内容讲解


下面是一些已经自动重写过的:

原型、原型链 的相关内容讲解


最后讲一个小bug:

原型、原型链 的相关内容讲解

这是因为js的精度不准的原因,

本文讲解了原型、原型链 的相关内容,更多相关知识请关注。

相关推荐:

JQuery中DOM操作——wrap

django 使用 request 获取浏览器发送的参数

React this绑定的几点思考

以上就是原型、原型链 的相关内容讲解的详细内容,更多请关注其它相关文章!

相关标签: 原型、原型链