[[Get]]:访问属性时调用的函数;
[[Set]]:设置属性时调用的函数;
下面以一个实例对象直接讲解这两个特性:
//数据特性; var teren = {}; Object.defineProperty(teren,{ value:"teren", writable:false, enumerable:true, configurable:true }) //访问器特性; //html <div id="name"></div> //js var obj = Object.defineProperty({},"name",{ set:function(name){ document.getElementById('name').innerHTML=name }, get:function(){ console.log( document.getElementById('name').innerHTML ) }, }) obj.name = "hello world" obj.name
[demo]
Object.defineProperties可以一次性配置对象的多个属性;
2. 创建对象的方式
上一节我们对面向对象的程序设计思想和对象有了初步理解,这一节我们深入探讨一下对象的创建方式及其优缺点;
创建对象的不同方式也可以简单的称作设计模式,不同的设计模式在实际编程应用中起到不同的作用;
2.1 单例模式
单例模式就是产生一个类的唯一实例对象,它能够确保您只有一个对象实例能够实际派上用场;
单例模式下,创建对象方式如下:
var singleton = { attr:1, method:function(){ return this.attr } } var ex1 = singleton; var ex2 = singleton; ex1 === ex2//true
上述创建单例的方式:
优点:使用非常简捷;
缺点:缺乏封装,成员暴露,初始化时占用资源;
可以使用闭包方式解决这一问题:
var substance = (function(){ var unique; function init(){ var type; return { setType:function(t){ return type = t; } } } return { getInstance:function(){ if(!unique){ unique = init(); } return unique; } } })(); var Adam = substance.getInstance(); var Eve = substance.getInstance(); Adam === Eve Adam.setType('Man')//Man
2.2 工厂模式
单例模式只能创作单个实例对象,也就是说如果将该实例对象赋予多个变量时,会存在对象的引用问题,即修改其中一个变量会影响到另一个变量;
有时我们需要创造多个结构相似的对象,只有部分属性有所区别,这时候工厂模式派上用场;
工厂模式的设计思想就是能够像工厂一样批量生产出相似属性和方法的对象,使用工厂模式能解决多个相似的问题,例如创造多个弹窗(只是标题不同);