クロージャー-基本的なデータ型と参照型へのアクセス

関数の外部から関数の内部の変数にアクセスするために、クロージャメソッドをよく使用します

基本的な変数タイプにアクセスする

基本的なデータ変数を保護して、直接アクセスできないようにします(読み取り、書き込み)

function operateBaseVariable(){
    
    
	let a = 10
	function getA() {
    
    
		return a
	}
	function setA(any){
    
    
		a = any
	}
	return {
    
    
		getA,
		setA,
	}
}
let opertaeBase = operateBaseVariable()//这是一个对象,对象里面包含两个函数
//获取a的值
opertaeBase.getA()
//设置a的值
opertaeBase.setA('a 被重新设置了')

これは機密データのカプセル化です。a。カプセル化の原則の1つは、内部実装メソッドをできるだけ公開しないことです。データaはここで保護されていますが、操作方法を公開しているため、次の点を改善できます。

function operateBaseVariable(){
    
    
	let a = 10
	function getA() {
    
    
		return a
	}
	function setA(any){
    
    
		a = any
	}
	return {
    
    
		getBaseA: getA,
		setBaseA: setA,
	}
}
let opertaeBase = operateBaseVariable()//这是一个对象,对象里面包含两个函数
//获取a的值
opertaeBase.getBaseA()
//设置a的值
opertaeBase.setBaseA('a 被重新设置了')

ここで、データaを操作してアクセスしたい場合は、getBaseA()とsetBaseA()しか使用できません。そうすると、他の開発者は内部で読み書きする方法を知りませんが、これら2つを介して実行できることだけを知っています。メソッド。操作

参照データ型(配列)にアクセスする

配列を保護する方法は?コードに直接移動します

function operateComplexVariable(){
    
    
	let arr = [1,2,3]
	function getArr() {
    
    
		let newArr = [...arr] //深拷贝
		return newArr
	}
	function pushArr(any){
    
    
		arr.push(any)
	}
	return {
    
    
		getComplexArr: getArr,
		pushComplexArr: pushArr,
	}
}
let opertaeComplex = operateComplexVariable()//这是一个对象,对象里面包含两个函数
//获取arr的值
opertaeBase.getComplexArr()
//设置a的值
opertaeBase.pushComplexArr('arr push 的数据')

参照データ型(オブジェクト)にアクセスする

function obj() {
    
    
    let mySymbol = Symbol()  /* es6 出现的新的基本数据类型,我只是想要使用一下 */
    let obj = {
    
    
        name: '张三',
        age: 18,
        sex: '男',
        [mySymbol]: 'symbol数据'
    }
    function getObj(){
    
    
        let newobj = {
    
    }
        Object.assign(newobj,obj)
        return newobj
    }
    function setObj(setObj){
    
    //setObj应该是个对象
        //Object.assign(obj,setObj)
        //对象只有一级属性时,用这个方法深拷贝没有问题
        //在对象的二级属性为引用类型时,这个方法就是浅拷贝二级属性了了
        //更改
        return JSON.parse(JSON.stringify(obj ))
    }
    return {
    
    
	    getObject: getObj,
	    setObject: setObj,
    }
}
let objOperate = obj()
objOperate.getObject()
objOperate.setObject({
    
    add: '新增数据'})
console.log(objOperate.getObject())

これは基本型データとは異なり、取得した関数でarr(アドレス)が直接公開されている場合は、まったく保護されません。これは、参照型がメモリに格納されているためです。

基本データストレージはスタックに直接格納され、誤操作は保護されたaの値に影響しません。
参照データ型はヒープに格納されます。保護されたarrが直接返される場合、誤操作はarrの値を変更します。 、これが操作の場合は、ディープコピーを作成します。外部の誤操作があったとしても、変更されたのはarrの代替newArrであるため、保護されたarrには影響しません。

Object.assign
レプリケーションの原則、内部実装は次のようになります

//由上面的错误的思考
Object.assign = function(newObj,oldObj) {
    
    
	for(let key in oldObj) {
    
    
		newObj[key]=oldObj[key]
	}
	return newObj
}


ここに写真の説明を挿入

個人的な意見ですが、始めてすぐに、間違いがあれば訂正してください。

おすすめ

転載: blog.csdn.net/Chennfengg222/article/details/104659620