我的编程空间,编程开发者的网络收藏夹
学习永远不晚

JS继承、工厂构造及原型设计模式实例分析

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

JS继承、工厂构造及原型设计模式实例分析

这篇文章主要介绍“JS继承、工厂构造及原型设计模式实例分析”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“JS继承、工厂构造及原型设计模式实例分析”文章能帮助大家解决问题。

正文

正是由于:原型链继承和构造函数继承的 “毛病”

  • 原型链继承:所有继承的属性和方法都会在对象实例间共享,无法做到实例私有。

  • 构造函数继承:子类不能访问父类原型上的方法。

组合继承应运而生:

function SuperType(name){     this.name = name;     this.colors = ["red", "blue", "green"];}function SubType(name, age){     SuperType.call(this, name) // 构造函数继承 (两次调用父类构造函数)     this.age = age;}SuperType.prototype.sayName = function() {     console.log(this.name);}SubType.prototype = new SuperType() // 原型链继承 (一次调用父类构造函数)SubType.prototype.sayAge = function() { console.log(this.age);}let s1 = new SubType("Nicholas", 29)let s2= new SubType("Greg", 27)s1.colors.push("yellow")console.log(s1.colors) // ['red', 'blue', 'green', 'yellow']console.log(s2.colors) // ['red', 'blue', 'green']s1.sayName() // Nicholass2.sayName() // Gregs1.sayAge() // 29s2.sayAge() // 27

但是呢?这样做,会有效率问题,父类构造函数始终会被调用两次:一次是在子类构造函数中调用,另一次在是创建子类原型时调用。

本质上,子类原型最终是要包含超类对象的所有实例属性,子类构造函数只要在执行时重写自己的原型就行了。

这个时候有一个新的思路!

不通过调用父类构造函数给子类原型赋值,而是取得父类原型的一个副本。使用寄生式继承来继承父 类原型,然后将返回的新对象赋值给子类原型。

核心代码是:通过工厂的方式,增强一个新对象:

function createAnother(original){     let clone = Object(original); // 通过调用函数创建一个新对象     clone.sayHi = function() { // 以某种方式增强这个对象         console.log("hi");     };     return clone; // 返回这个对象}

将组合代码改造一下,完整代码是:

function inheritPrototype(subType, superType) {     let prototype = Object(superType.prototype); // 创建对象     prototype.constructor = subType; // 增强对象     subType.prototype = prototype; // 赋值对象}function SuperType(name) {     this.name = name;     this.colors = ["red", "blue", "green"];}function SubType(name, age) {     SuperType.call(this, name); // 构造函数继承(只调了一次)     this.age = age;}SuperType.prototype.sayName = function() {     console.log(this.name);};inheritPrototype(SubType, SuperType); // 寄生继承SubType.prototype.sayAge = function() {     console.log(this.age);};let s1 = new SubType("Nicholas", 29)let s2= new SubType("Greg", 27)s1.colors.push("yellow")console.log(s1.colors) // ['red', 'blue', 'green', 'yellow']console.log(s2.colors) // ['red', 'blue', 'green']s1.sayName() // Nicholass2.sayName() // Gregs1.sayAge() // 29s2.sayAge() // 27

这里只调用了一次 SuperType 构造函数,避免了 SubType.prototype 上不必要也用不到的属性;而且,原型链仍然保持不变,instanceof 操作符和 isPrototypeOf() 方法正常有效。

寄生式组合继承可以算是【引用类型】继承的最佳模式

os:不过这里的增强写法,理解起来真是怪,为什么父类的显示原型的构造函数等于子类?

SuperType.prototype.constructor=== SubType // true

大概是为了,通过寄生实现:父类、子类都由同一函数构造;

SubType === SubType.prototype.constructor // trueSuperType.prototype.constructor === SubType.prototype.constructor // true

关于“JS继承、工厂构造及原型设计模式实例分析”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注编程网行业资讯频道,小编每天都会为大家更新不同的知识点。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

JS继承、工厂构造及原型设计模式实例分析

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

JS继承、工厂构造及原型设计模式实例分析

这篇文章主要介绍“JS继承、工厂构造及原型设计模式实例分析”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“JS继承、工厂构造及原型设计模式实例分析”文章能帮助大家解决问题。正文正是由于:原型链继承和构
2023-07-02

JS构造函数和实例化的关系及原型引入举例分析

这篇文章主要介绍“JS构造函数和实例化的关系及原型引入举例分析”,在日常操作中,相信很多人在JS构造函数和实例化的关系及原型引入举例分析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”JS构造函数和实例化的关系
2023-06-21

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录