最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • 【FuckingJavaScript系列】原型编程,你真的理解了吗?

    正文概述 掘金(龙哈哈同学)   2021-05-03   564

    前言

    大家好,我是龙哈哈。一个 JavaJavaScript 两栖动物。
    本篇是 FuckingJavaScript 系列的第二篇,我们来一起回顾一下 原型 的相关知识。

    什么是原型编程

    为什么其他的 面向对象 语言没有 原型JavaScript 却要有呢?
    带着这个疑问,我们去查阅下JavaScript发展史的相关资料

    JavaScript诞生史

    没错,就是window.navigator.appName的那个Netscape

    这也就解释了JavaScript中函数是第一公民的原因。

    这就是命名 Java+Script 的由来,祖上还是和Java有一定渊源的

    设计时间

    开始结束,只用了天。

    设计思路

    • 借鉴C的基本语法
    • 借鉴Java的数据类型和内存管理
    • 借鉴Scheme,将函数提升到第一等公民的地位
    • 借鉴Self,使用基于原型(prototype)的继承机制

    NetscapeBrendan Eich 可能也没有想到,JavaScript将来会成为全球最流行的编程语言。
    JavaScript Coder 来说,奇妙的旅程,就此开始。

    什么是原型编程

    原型编程面向对象编程 的一种风格和方式。

    简单来说,这种风格是在不定义class的情况下创建一个 object

    Self语言是原型编程这一派的祖师爷, JavaScipt在设计的时候采用了这种编程方式。

    JavaScipt原型的三座大山

    • prototype
    • __ proto __
    • constructor

    首先要明确

    1. prototypeFunction 独有
    2. __ proto __, constructorObject 独有

    经典祭祖图

    【FuckingJavaScript系列】原型编程,你真的理解了吗?

    不慌,我们先看一段代码

    function Hero(name) {
        this.name = name;
    }
    // Hero 的 prototype
    Hero.prototyoe.country = 'demacia';
    // 创建实例
    var garen = new Hero('garen');
    var jarvanIV = new Hero('jarvanIV');
    // 实例可继承函数原型对象的属性
    console.log(garen.country); // demacia
    console.log(jarvanIV.country); // demacia
    // 函数的原型对象
    console.log(Hero.prototype);
    // 对象的原型
    console.log(garen.__proto__);
    console.log(jarvanIV.__proto__);
    

    prototype

    函数的原型对象,Function 独有,指向了一个对象,对象是 调用该函数而创建的实例的原型__proto__

    prototype 本身也是个 Object,所以 prototype也有 __proto__constructor

    __ proto __

    对象的原型,Object 独有,指向了一个对象,对象是 创建该对象的函数的原型对象

    // 对象的原型 和 函数的原型对象,指向同一地址,是相同的对象
    console.log(garen.__proto__ === Hero.prototype);
    

    我们上面说 prototype也是对象,所以也有 __proto__,所以延伸一下就有

    // Hero.prototype是个对象
    // 对象的原型就指向创造ta的函数的原型对象,即 Object 的 原型对象
    console.log(Hero.prototype.__proto__ === Object.prototype); // true
    // 终点站到了 null
    console.log(Object.prototype.__proto__ === null); // true
    

    对象之间通过__proto__连接起来,这就是原型链。当前对象上不存在的属性方法可以通过__proto__一层层往上查找,直到终点站 null

    我们常用的不同数据类型的方法都是靠 __proto__ 继承而来

    constructor

    构造函数,Object 独有,顾名思义,指向了函数本身

    // 函数的原型对象的构造函数,指向函数本身
    console.log(Hero.prototype.constructor === Hero); // true
    

    函数本身也是个对象,所以也有 __proto__,所以延伸一下就有

    // 命名函数的 原型 指向 Function 的原型对象
    console.log(Hero.__proto__ === Function.prototype); // true
    // Function原型对象的原型,指向 Object 的原型对象
    console.log(Function.prototype.__proto__ === Object.prototype); // true
    // 终点站到了 null
    console.log(Object.prototype.__proto__ === null); // true
    

    总结

    1. JavaScript 借鉴 Self,使用基于原型(prototype)的继承机制
    2. Object特有 __proto__constructorFunction 特有 prototype
    3. prototype 也是个Object,也有 __proto__constructor
    4. Object__proto__ 指向 创建该对象的函数prototype
    5. 对象之间通过__proto__连接起来,当前对象上不存在的属性方法可以通过__proto__一层层往上查找,直到终点站 null,通过 __proto__ 将不同对象连接起来的链路就是原型链
    6. constructor 指向对象的构造函数,所有函数(也可看做是对象)最终的构造函数都指向Function

    最后

    文中如有错误,欢迎在评论区指正。
    如果这篇文章对你有所帮助,欢迎点赞、评论和关注。

    系列文章

    • 【FuckingJavaScript系列】数据类型,你真的掌握了吗?
    • 【FuckingJavaScript系列】原型编程,你真的理解了吗?
    • 【FuckingJavaScript系列】函数编程,你真的熟练了吗?
    • 【FuckingJavaScript系列】异步编程,你真的学会了吗?
    • 【FuckingJavaScript系列】事件循环,你真的明白了吗?
    • 【FuckingJavaScript系列】垃圾回收,你真的清楚了吗?

    起源地下载网 » 【FuckingJavaScript系列】原型编程,你真的理解了吗?

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元