JavaScript对象构造与面向对象编程模式他人无法获得。静态属性,属于类,不单单属于对象。包含公共和私有属性。如何创建私有属性?与Java不同的是,JavaScript在创建对象时,无论是使用类、字面量还是函数构造函数,一般情况下定义属性和方法后就可以公开调用,没有限制。使用#符号创建私有属性来定义私有属性。类WidgetD{#appName;constructor(){this.#appName="天气应用";}getName(){返回这个。#appName;}}varwidget4=newWidgetD();console.log(widget4.appName);//返回undefinedconsole.log(widget4.getName());//返回“天气应用程序”工程师在#出来之前如何实现私有属性。主要有三个方法:闭包、WeakMap和Symbol。使用闭包和IIFE创建私有属性首先,我们声明一个WidgetE变量,然后创建一个立即调用的函数表达式(IIFE)。在此表达式中,我们首先将内部appName变量分配给“weatherapplication”。之后,在函数中,我们给WidgetE赋值,这里赋值一个对象,在这个对象中我们定义了getName方法,返回外部函数的appName。//对象字面量varWidgetE;(function(){varappName="weatherapplication";WidgetE={getName:function(){returnappName;}};}());WidgetE.appName;//返回undefinedWidgetE。获取名称();//返回“天气应用”先定义一个函数,在里面声明一个变量appName,然后创建一个getName的表达式函数,返回appName。//构造函数WidgetF(){varappName="weatherapplication";this.getName=function(){返回appName;}}varwidget6=newWidgetF();console.log(widget6.appName);//返回undefinedconsole.log(widget6.getName());//返回“weatherapplication”的例子还有一个问题,就是每次我们创建一个新的对象时,都会重新创建私有属性,这样会造成重复工作和冗余内存。解决这个问题的方法是为原型分配共同的属性和功能,让同一个建造者创建的对象可以共享这些隐藏的属性。functionWidgetG(){varappName="天气应用";this.getName=function(){返回appName;}}WidgetG.prototype=(function(){varmodel="Androidsupport";return{getModel:function(){returnmodel;}}}());varwidget7=newWidgetG();console.log(widget7.getName());//返回“天气应用程序”console.log(widget7.getModel());//返回“支持安卓”。使用Wea??kMap创建私有属性Set。使用了set的数据结构,Map中使用了字典的数据结构。我们首先声明一个WidgetG变量。接下来,创建一个块级作用域。在此范围内,我们声明了一个privatePropsWeakMap变量。然后我们给WidgetG赋一个函数声明,设置WeakMap的key名称为this,key值中的appName为“weatherapplication”。接下来我们根据WidgetF的原型创建一个getName方法,返回appName的值。varWidgetH;{letprivateProps=newWeakMap();WidgetH=function(){privateProps.set(this,{appName:"天气应用"});}WidgetH.prototype.getName=function(){returnprivateProps.get(this).appName;}}varwidget8=newWidgetH();console.log(widget8.appName);//返回undefinedconsole.log(widget8.getName());//return"weatherapplication"用Symbol创建私有属性和前面的例子类似,这里我们建立了一个块级作用域,不同的是我们将privateProps从WeakMap改成了Symbol来实现私有属性。varWidgetI;{让privateProps=Symbol();WidgetI=function(){this[privateProps]={appName:"WeatherApplication"};}WidgetI.prototype.getName=function(){returnthis[privateProps].appName;}}varwidget9=newWidgetI();console.log(widget9.getName());//返回“weatherapp”如何创建公共属性?创建公共静态属性static:静态属性只能应用于类本身。创建私有静态属性其实就是加上#号和static关键字来使用。
