javascript设计模式学习(一):构造函数模式(constructor)

之前在我学习javascript的过程中总有这样一种感觉:功能我都能完成,但是总是觉得代码很杂乱无章,根据我之前面向对象语言的经验我想要对代码进行封装但总感觉力不从心,我意识到我对于javascript语言还不够了解,于是我看了一些书以及大神的网站,所以有了这篇文章。

javascript设计模式之——构造函数模式

在典型的面向对象程序设计语言中,构造函数是一个用来初始化对象属性的特殊函数,但是我们知道在javascript中没有class关键字(尽管es6已经有了class关键字),但我们仍然可以通过在函数前加上new前缀让这个函数作为构造函数并且初始化参数。下面是基本的构造函数模式的应用:

Person = function(name,age){
    this,name = name;
    this.age = age;
    this.sayHi = function(){
        return "Hello My name is "+this.name+" and I'm "+this.age+" years old.";
    };
}

var Tom = new Person("Tom",21);
console.log(Tom.sayHi());

但是这种形式存在一些问题,我们可以看到在Person中有一个函数sayHi(),在我们每次创建一个新的Person对象时就会产生一个sayHi()的副本,但是这个函数的功能在每一个对象中都是一样的,这样就会造成重复定义的问题。好在有解决方法。
在javascript中,每一个Object都有一个属性prototype,我们可以通过这个属性对代码进行一些优化:

Person.prototype.sayHi = function(){
    return "Hello My name is "+this.name+" and I'm "+this.age+" years old.";
}

现在sayHi()方法被所有Person对象实例共享了,这就是带原型的构造器(constructor)。
构造函数很好地解决了工厂模式(我们后面会讲到)的无法识别对象的问题,因为在工厂模式中所有的对象实例都是通过显示创建Object得到的。

我们现在已经知道了怎样使用构造器创建对象,但有一些规则我们需要遵守:

1.函数名和实例化构造名相同且大写, (PS:非强制,但这么写有助于区分构造函数和 普通函数);
2.通过构造函数创建对象必须是有`new`关键字。

参考书:

https://addyosmani.com/resources/essentialjsdesignpatterns/book/#constructorpatternjavascript

猜你喜欢

转载自blog.csdn.net/kesilll/article/details/80703088