JavaScript的设计模式(一)-构造器模式

构造器模式

在面向对象编程中,构造器是一个当新建对象的内存被分配后,用来初始化该对象的一个特殊函数。在JavaScript中几乎所有的东西都是对象,我们经常会对对象的构造器十分感兴趣。

对象构造器是被用来创建特殊类型的对象的,首先它要准备使用的对象,其次在对象初次被创建时,通过接收参数,构造器要用来对成员的属性和方法进行赋值。

1.对象创建

/* 创建对象的方法 */
let newObject = {};
// or
let twoObject = Object.create(null);
// or
let threeObject = new Object();

console.log(newObject); //{}
console.log(twoObject); //[Object: null prototype] {}
console.log(threeObject); //{}

2.对象值的设置

/**
 * 对象的赋值
 *  */ 
// 1. 点语法
newObject.test = '我是设置的key';
// 2.方括号语法
newObject['name'] = '我是方括号设置的';
// 3. defineProperty对象设置方法
// 3.1 单属性的设置
Object.defineProperty(newObject,'define',{
    value : '我是方法设置的',
    writable : true, //是否可以重新定义属性
    enumerable : true, //是否能被检举出来  比如循环的时候能不能拿到这个值
    configurable : true, //是否可以删除该属性
});
// 3.2 多属性的设置
Object.defineProperties(newObject,{
    "one" : {
        value : '我的多属性的一',
        writable : true,
        configurable : true,
        enumerable : true,
    },
    "two" : {
        value : '我的多属性的一',
        writable : true,
        configurable : true,
        enumerable : true,
    },

})
/* 
{ test: '我是设置的key',
  name: '我是方括号设置的',
  define: '我是方法设置的',
  one: '我的多属性的一',
  two: '我的多属性的一' }
*/
console.log(newObject); 

3.对象的获取

/**
 * 对象的获取
 */
let obj = {};
// 1. 点语法
obj.test = '我是设置的key';
console.log(obj.test); //我是设置的key
// 2.方括号语法
obj['name'] = '我是方括号设置的';
console.log(obj['name']); //我是方括号设置的

 4.对象创建类

4.1 构造函数

// 在es6以前  JS是没有类这个概念的 是通过构造函数 + new 来创建一个类似类的对象
// 关键字this引用到刚被创建的对象
// 一般类的创建首字母都是大写的
function People(name) {
  this.name = name;
  this.say = function () {
    return this.name + "说了话";
  };
}
let jack = new People("jack"),
    tom = new People("Tom");
console.log(jack.say()); //jack说了话
console.log(tom.say()); // Tom说了话

4.2 构造函数改进

/* 
上述的创建对象有几个弊端
一是难以继承,
二是每个People构造函数创建的对象中,say()之类的函数都被重新定义,
理想的情况是所有People类型的对象都应该引用同一个函数。 通过原型链的形式  因为JS对象都有属于自己的原型链
*/
function People_1(name) {
    this.name = name;
    
};
People_1.prototype.say = function(){
    return this.name + "说了什么话";
}
let jack = new People_1("jack"),
    tom = new People_1("Tom");
console.log(jack.say()); //jack说了什么话
console.log(tom.say()); // Tom说了什么话
/* 
这样创建的话  这个say方法就能被所有继承于 People_1的类所共享使用
*/

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章