6.23 js笔记

封装

最简单的封装:

假定我们把人看成一个对象,它有"名字"和"性别"两个属性(property),以它作为原型,通过字面量(对象直接量)表示如下:

var Person = {
    name : '',
    sex : ''
  }

现在,我们需要根据这个原型对象的规格(schema),生成两个实例对象。

var man = {}; // 创建一个空对象

        man.name = "亚当"; // 按照原型对象的属性赋值

        man.sex = 1;

        var women = {};

        women.name = "夏娃";

        women.sex = 0;

这就是最简单的封装了,把两个属性封装在一个对象里面。其中封装的是数据。

进阶封装-工厂模式:

前言:工厂模式是软件工程领域一种广为人知的设计模式,这种模式抽象(封装)了创建具体对象的过程。js中,用函数来封装以特定接口创建对象的细节。

代码:


function createPerson(name, sex) {
        return {
                name: name,
                sex: sex
        };
}
//或者 变体
function createPerson(name, sex) {
        var o = new Object();
        o.name = name;
        o.sex = sex;
        return o;
}


var adam = createPerson("亚当", 1);
var eve = createPerson("夏娃", 0);

构造函数式模式:

前言:JS中的构造函数可以用来创建特定类型的对象。也可以创建自定义的构造函数,从而自定义对象类型的属性和方法。

代码:

function Person(name, sex) {
        this.name = name;
        this.sex = sex;
        this.sayName = function () {
                alert(this.name);
        };
}


var adam = new Person("亚当", 1);
var eve = new Person("夏娃", 0);

将上方工厂模式的代码更改为构造函数模式的代码,除了增加了sayName的方法外,还有些区别。

区别:

没有显式的创建对象;
直接将属性和方法赋值给了this对象;
没有return;
注意:要创建Person的实例,必须使用new操作符。

以这种方式调用构造函数实际上会经历如下4个步骤:

创建一个新对象;
将构造函数的作用域赋给新对象(因此this就指向了这个新对象);
执行构造函数中的代码(为这个新对象添加属性);
返回新对象;
可以通过 instanceof 操作符确认实例是否后属于Person构造函数

代码:

adam instanceof Person;//true
eve instanceof Person;//true

这里稍微点一下构造函数

构造函数模式

为了解决从原型对象生成实例的问题,Javascript提供了一个构造函数(Constructor)模式。

所谓"构造函数",其实就是一个普通函数,但是内部使用了this变量。对构造函数使用new运算符,就能生成实例,并且this变量会绑定在实例对象上。

比如,猫的原型对象现在可以这样写,


  function Cat(name,color){

    this.name=name;

    this.color=color;

  }

我们现在就可以生成实例对象了。

 var cat1 = new Cat("大毛","黄色");

  var cat2 = new Cat("二毛","黑色");

  alert(cat1.name); // 大毛

  alert(cat1.color); // 黄色

这时cat1和cat2会自动含有一个constructor属性,指向它们的构造函数。

  alert(cat1.constructor == Cat); //true

  alert(cat2.constructor == Cat); //true

Javascript还提供了一个instanceof运算符,验证原型对象与实例对象之间的关系。

  alert(cat1 instanceof Cat); //true

  alert(cat2 instanceof Cat); //true

认识深拷贝和浅拷贝

先来看一下下面的代码:

var a = 1;
var b = a;
b = 2;
console.log(a, b); // 1 2

var obj1 = {
    a: 1
};
var obj2 = obj1;
obj2.a = 2;
console.log(obj1.a, obj2.a); // 2 2

我们知道,JavaScript中有两大数据类型:分别是值类型和对象类型。值类型是没有深拷贝和浅拷贝这个概念的,这个和它们存储方式有关。值类型的数据是存储在栈内存中,按值访问;而对象类型的数据是存储在堆内存中,按引用(地址、指针)访问。
对象类型的数据直接赋值后会共用一个引用,改变其中一个都会影响到另一个,深拷贝和浅拷贝就是为解决这类对象直接赋值后依然“连接”的问题。那么就可以回答第一个问题,什么是浅拷贝和深拷贝了。
浅拷贝:复制一层对象的属性,并不包括对象里面是引用类型的数据,当改变拷贝的对象里面的引用类型时,源对象也会改变。
深拷贝:重新开辟一个内存空间,需要递归拷贝对象里的引用,直到子属性都为基本类型。两个对象对应两个不同的地址,修改一个对象的属性,不会改变另一个对象的属性。
第二个问题,它们的区别:首先深拷贝和浅拷贝只针对如Object,Array这样的复杂对象的。深拷贝和浅拷贝的“深浅”主要针对的是对象的“深度”,简单来说,浅拷贝只复制一层对象的属性,而深拷贝则递归复制了所有层级。

Object.assign()
Object.assign()方法可以把任意多个的源对象自身的可枚举属性拷贝给目标对象,然后返回目标对象。

var obj1 = {
    a: 1,
}
var obj2 = Object.assign({}, obj1);
obj2.a = 2;
console.log(obj1.a); // 1
  • 简单手写实现

下面来简单的实现一下浅拷贝:

function copy(obj) {
    var target = {};
    for (key in obj) {
        target[key] = obj[key];
    }
    return target;
}

var obj1 = {
    a: 1,
    b: {
        c: '我就是我,颜色不一样的烟火!',
    },
}
var obj2 = copy(obj1);
obj2.a = 2;
console.log(obj1.a); // 1

以上便是浅拷贝的简单实现,拷贝完成后更改obj2.a的值,但是obj1.a的值没有发生改变,说明实现了浅拷贝。
浅拷贝可以解决常见的问题,但是如果不常见呢,比如说对象里面还有子对象,那么用浅拷贝就不够彻底;比如:

var obj3 = copy(obj1);
obj3.b.c = '你被我改变了吧!哈哈';
console.log(obj1.b.c); // 你被我改变了吧!哈哈

上面代码中,拷贝完成后更改了obj3.b.c,结果obj1.b.c也随之改变,说明子对象b依然存在共用同一个引用的现象,所以浅拷贝拷贝的并不彻底。这时候深拷贝就该上场了,它能用递归的思想继续深挖,直到最底层为止。

递归拷贝实现
下面用递归简单的实现一下深拷贝:

function deepCopy(obj) {
    var target = isArray(obj) ? [] : {};
    for (key in obj) {
        var copy = obj[key];
        if (isObject(copy) || isArray(copy)) {
            target[key] = deepCopy(copy); // 核心代码
        } else {
            target[key] = copy;
        }
    }
    return target;
}
function isObject(obj) {
    return toString.call(obj) === '[object Object]';
}
function isArray(arr) {
    return toString.call(arr) === '[object Array]';
}
var obj4 = deepCopy(obj1);
obj4.b.c = '我摊牌了!';
console.log(obj1.b.c); // 我就是我,颜色不一样的烟火!

深拷贝是拷贝得非常彻底的,可以做到真正意义上的杜绝共用一个引用的问题。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 为了回答这个问题,我们首先要了解3615xs和DSM6.23是什么。 3615xs是Synology公司推出的一款服务器型号,它采用了高性能的硬件配置和多功能的软件支持,适用于企业级和高性能的网络存储需求。 DSM6.23是Synology公司的操作系统——DiskStation Manager的一个版本。DSM是一款用于管理和操作Synology NAS(网络附加存储)设备的操作系统,提供了多种功能和服务,如文件共享、备份、多媒体娱乐、虚拟化等。 如果您需要下载DSM6.23,可以按照以下步骤进行: 1. 首先,在您的浏览器中打开Synology公司的官方网站(www.synology.com)。 2. 在官方网站的主页上,找到“产品”或“软件”选项卡,并点击进入。 3. 在产品或软件页面中,寻找与您的设备型号相对应的选项,即3615xs。 4. 找到适用于3615xs的最新DSM版本,即DSM6.23。您可以通过搜索框或浏览列表的方式找到该版本。 5. 在DSM6.23的页面上,将鼠标悬停在下载按钮上,然后点击以开始下载。 6. 根据您的网络速度和服务器设置,下载速度可能会有所不同。请耐心等待,直到下载完成。 7. 下载完成后,您可以根据Synology的安装说明,将DSM6.23安装到3615xs服务器上。 需要注意的是,在下载和安装任何操作系统之前,请确保您有合适的权限,并且您的设备符合系统的要求。此外,建议您备份重要的数据,以防止意外数据丢失。 希望以上信息对您有所帮助,祝您成功下载并安装DSM6.23! ### 回答2: 3615xs是Synology(群晖)公司推出的一款高性能网络存储设备,是其DSM操作系统的一个版本。 DSM6.23是Synology公司发布的一个重要的DSM6.x版本升级,该版本带来了许多新功能和改进,包括性能优化、安全性加强、应用功能增强等。 要下载3615xs DSM6.23版本,首先需要到Synology公司的官方网站上寻找相应的下载页面。在官网上,用户可以找到适用于3615xs的DSM6.23版本的下载链接。 点击下载链接后,会进入一个下载页面,可以选择合适的下载方式,如通过浏览器下载或通过下载管理器下载等。 在完成下载之前,用户需要先同意Synology公司的相关服务条款和条件,并进行相应的验证。这可以确保用户在下载过程中遵守相应的使用规定。 一旦下载完成,用户可以将下载的软件包文件传输到3615xs设备上,并按照Synology公司提供的安装指南进行安装和配置。 安装完成后,用户可以通过浏览器访问3615xs设备的管理界面,进行系统设置、应用安装、共享文件管理等操作。 总之,要下载3615xs DSM6.23版本,用户需要访问Synology公司的官方网站,找到适用于3615xs的DSM6.23版本的下载链接,并按照提示进行下载、安装和配置操作。 ### 回答3: 3615xs是索尼公司推出的一款NAS(网络附加存储器)设备,它具有强大的处理能力和大容量的存储空间。DSM6.23是Synology公司针对其NAS设备推出的最新操作系统版本。 要下载3615xs和DSM6.23,首先需要在互联网上搜索并找到Synology公司官方网站。在其官方网站上,我们可以找到产品支持和下载页面。 在产品支持页面上,我们需要选择正确的设备型号3615xs,并搜索最新的操作系统版本DSM6.23。一旦找到了正确的操作系统版本,我们就可以点击下载按钮进行下载。 下载过程可能需要一些时间,具体取决于网络连接的速度。一旦下载完成,我们需要将下载的文件保存到我们想要安装的NAS设备中的某个位置。 完成下载后,我们需要登录NAS设备的管理界面。在管理界面中,我们可以找到软件更新的选项。在软件更新选项中,我们可以选择刚刚下载的文件,并开始安装更新。 安装过程可能需要一些时间,取决于设备的性能和文件的大小。安装完成后,设备将会重新启动,并开始使用最新的操作系统版本DSM6.23。 通过下载和安装最新的操作系统版本,我们可以享受到更好的性能、更多的功能和更好的用户体验。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值