创建对象的几种方式

2023-11-18

 /*一、工厂模式*/

    /*工厂模式解决了创建相似对象的问题,但却没有解决对象识别的问题(怎样知道一个对象的类型)*/
    function createPerson(name,age,job){
        var o = new Object();
        o.name = name;
        o.age = age;
        o.job = job;
        o.sayName = function () {
            alert(this.name);
        };
        return o;
    }
    var person1 = createPerson("Nicholas",29,"Software Engineer");
    var person2 = createPerson("Dzz",24,"Web Engineer");

    /*二、构造函数模式*/

    /*构造函数模式
    * 要创建一个新实例,必须使用new操作符。以这种方式调用构造函数实际上会经历一下四个步骤
    * 1、创建一个新的对象
    * 2、将构造函数的作用域赋给新对象(因此this就指向了这个新对象)
    * 3、执行构造函数中的代码(为这个新对象添加属性)
    * 4、返回新对象
    * */
    function Person(name,age,job){
        this.name = name;
        this.age = age;
        this.job = job;
        this.sayName = function () {
            alert(this.name);
        };
    }
    var person1 = new Person("Nicholas",29,"Software Engineer");
    var person2 = new Person("Dzz",24,"Web Engineer");

    /*三、原型模式模式*/

    /*原型模式
    * 使用原型对象的好处是可以让所有的对象实例共享它所包含的属性和方法
    * */
    function Person(){

    }
    Person.prototype.name = "Nicholas";
    Person.prototype.age = 29;
    Person.prototype.job = "Software Engineer";
    Person.prototype.sayName = function () {
        alert(this.name);
    };
    var person1 = new Person();
    person1.sayName();//Nicholas

    var person2 = new Person();
    person2.sayName();//Nicholas

    /*四、组合使用构造函数模式和原型模式*/

    /*组合使用构造函数模式和原型模式
    *这个例子中实例属性都是在构造函数中定义的,而由所有实例共享的属性constructor和方法sayName()则是在原型中定义的。而
     * 修改了person1.friends(向其中添加一个新的字符串),并不会影响到person2.friends因为它们分别引用了不同的数组.这种
     * 构造函数与原型混成的模式,是目前在ECMAscript中使用最广泛、认同度最高的一种创建自定义类型的方法*/
    function Person(name,age,job){
        this.name = name;
        this.age = age;
        this.job = job;
        this.friends = ["Shelby","Court"];
    }
    /*Person.prototype为Person的原型对象 */
    Person.prototype = {
        constructor: Person,
        sayName : function (){
            alert(this.name);
        }
    }
    var person1 = new Person("Nicholas",24,"Software");
    var person2 = new Person("DZZ",24,"Web");
    person1.friends.push("Van");
    alert(person1.friends);//Shelby,Court,Van
    alert(person2.friends);//Shelby,Court
    alert(person1.friends === person2.friends);//false;
    alert(person1.sayName === person2.sayName);//true

    /*五、动态原型模式*/

    /*动态原型模式
    * 这里只在sayName()方法不存在的情况下,才会将它添加到原型中。这段代码只会在初次调用构造函数时才会执行。
    * 此后,原型已经完成初始化,不需要再做什么修改了。这里对原型的修改,能够立即在所有实例中得到反应。
    * 使用动态原型模式时,不能使用对象字面量重写原型。如果在已经创建了实例的情况下重写原型,那么就会切
    * 断现有实例与新原型之间的关系*/
    function Person(name,age,job){
        //属性
        this.name = name;
        this.age = age;
        this.job = job;
        //方法
        if(typeof this.sayName != "function"){
            Person.prototype.sayName = function () {
                alert(this.name);
            }
        }
    }
    var friend = new Person("Nichloas",28,"Software Engineer");
    friend.sayName();


    /*六、寄生构造函数*/

    function Person(name,age,job){
        var o = new Object();
        o.name = name;
        o.age = age;
        o.job = job;
        o.sayName = function(){
            alert(this.name);
        };
        return o;
    }
    var friends = new Person("Nicholas",29,"Software Engineer");
    friends.sayName();//Nicholas


    /*七、稳妥构造函数*/
    function Person(name,age,job){
        //创建要返回的对象
        var o = new Object();
        //可以在这里定义私有变量和函数
        //添加方法
        o.sayName = function () {
            alert(name);
        };
        //返回对象
        return o;
    }
    var friend = Person("Nicholas",29,"Software Engineer");
    friend.sayName();//Nicholas

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

创建对象的几种方式 的相关文章

随机推荐

  • monitor-single-one-docker-host

    参考 https github com vegasbrianc prometheus 在github上有人使用docker compose启动Grafana Prometheus监控单台Host的docker容器 1 下载项目 git cl
  • 根据Explain结果中的key_len判断MySQL联合索引中实际用到的索引字段

    一 数据表staff 现有数据表staff 字符集utf8 并创建有一些字段单独索引及组合索引index age birth salary包含三个字段 sf age tinyint DEFAULT NULL sf birthday date
  • 廉价的全闪存雷电 NAS 折腾笔记:NUC9 操作系统踩坑

    上一篇文章中 分享了关于低成本全闪存 NAS 的个人方案选择 本篇文章 来聊聊硬件相关部分 以及软件的基础配置部分 也聊聊雷电组网的踩坑之旅 写在前面 我使用的设备是 NUC9i5QNX 这台设备的硬件基础规格 可以在 Intel ARK
  • 2023年华为od机试 Java【刻录光盘备份】

    前言 python代码 链接 JavaScript代码 链接 题目 有一系列文件需要通过光盘备份 每张光盘的容量固定为500MB 文件的大小均为整数MB并且不超过500MB 文件不可拆分或分卷备份 需要确定最少需要多少张光盘来完成备份 输入
  • ngnix+lua+js埋点 实现自定义日志采集

    ngnix lua js埋点 实现自定义日志采集 1 收集数据的页面 js埋点 在想要手机数据的页面预先放一段js代码 当用户发生行为时 触发js方法 收集数据 发到后端 http 192 168 4 101 index html 这里的i
  • 在Windons子系统ubuntu中安装ssh(保姆级教程)

    1 什么是ssh SSH Secure Shell 是一种用于远程登录和安全文件传输的网络协议 SSH服务是在计算机上运行的服务程序 它允许用户通过网络安全地远程访问计算机并执行各种操作 以下是关于SSH服务的一些重要信息 远程登录 SSH
  • 流操作

    StreamReader 与 FileStream 的区别用法 有关StreamReader的内容参考http blog sina com cn s blog 796ffec50100te51 html StreamReader 旨在以一种
  • “互联网+”最可行的路径就是“社群+”

    互联网 最可行的路径就是 社群 36氪的朋友们 2016 04 05 17 04 文章摘要 商业正从物以类聚走向人以群分 编者按 本文作者 卢彦 原文来自微信公众号 互联网思维 ID webthinking 36 氪经授权转载 前不久阿里
  • 【C++】通讯录管理系统

    1 系统功能介绍与展示 2 创建项目 3 菜单功能 代码 封装函数显示该界面 如 void showMenu 在main函数中调用封装好的函数 include
  • jmeter批量上传图片, csv文件参数化——详细讲解

    我们在测试的过程中 需要把图片放到请求中 而且还需要不一样的图片 批量修改图片后缀 我们也可以吧文件生成我们想要的后缀 1 首先创建一个文本txt 在文本中输入 ren jpg png 然后把txt的文件 修改 成bat后缀的 进行双击 在
  • 关于Altium Designer PCB元器件的3D封装

    关于Altium Designer PCB元器件的3D封装 虽然Altium Designer为我们提供了丰富的元件封装库资源 但是 在实际的电路设计中电子元器件技术的不断更新换代 有些特定的元器件封装仍需要我们自行制作 另外 有时根据工程
  • python3 中 dict和list 效率比较

    import time def count time func def int time args kwargs start time time time 程序开始时间 res func args kwargs over time time
  • 给 Ubuntu 操作系统配置静态 IP

    针对 Ubuntu 22 04 3 操作系统的静态 IP 配置 一 查看初始的网络信息 查看网卡名称 ifconfig 查看网关信息 route n 二 编辑网络配置文件 编辑文件 配置文件的名称可能不一样 自己去 etc netplan
  • 手把手教你Modelsim仿真【2020.4版本】

    首先新建一个文件夹 test5 打开Modelsim 依次选择 File gt Change Directory 把目录选择到创建的 test5 文件夹 创建库 依次选择 File gt New gt Library 一般我们选择第三个 库
  • 软文营销如何吸引用户情感意识引起共鸣

    当今互联网营销铺天盖地 自网络开始普及后 网络营销发展速度非常快 然而 我们需要在众多营销中取胜就需要技术创新 不管平台如何变化 有一个要素仍然至关重要 写好广告文案 因为文案内容才是读者了解你的关键所在 今天178软文网小编将分享我们最好
  • 大模型开发:从数据挖掘到智能应用

    在当今的数字化时代 数据的生成和处理已经成为一项重要的战略任务 随着大数据技术的发展 企业 组织以及个人对海量数据的需求越来越大 这也就催生了数据挖掘算法模型开发的快速发展 数据挖掘算法模型开发是一种从大量数据中提取有价值信息的过程 这些信
  • 国服ps4如何修改服务器地址,国服ps4如何修改服务器地址

    国服ps4如何修改服务器地址 内容精选 换一换 本节介绍如何查看云服务器的mac地址 云服务器的mac地址不支持修改 登录Linux云服务器 执行以下命令 查看云服务器的mac地址 ifconfig查看MAC地址ifconfig登录Linu
  • 【3分钟速读】运营到底是干啥的?

    欢迎关注天善智能 我们是专注于商业智能BI 人工智能AI 大数据分析与挖掘领域的垂直社区 学习 问答 求职一站式搞定 作者 陈老师 在咨询行业打拼了10 年 在如何诊断经营问题 建立分析体系 解决专项问题上有超过30个大型项目积累与实战 天
  • 时间序列预测(一)基于Prophet的销售额预测

    时间序列预测 一 基于Prophet的销售额预测 小O 小H 有没有什么方法能快速的预测下未来的销售额啊 小H Facebook曾经开源了一款时间序列预测算法fbprophet 简单又快速 传统的时间序列算法很多 例如AR MA ARIMA
  • 创建对象的几种方式

    一 工厂模式 工厂模式解决了创建相似对象的问题 但却没有解决对象识别的问题 怎样知道一个对象的类型 function createPerson name age job var o new Object o name name o age