前言:
本文是对面向对象第一篇的一个补充。
主要补充下面几点:
模拟重载
在Java中,有重载这个说法,js中,我们可以模拟重载的效果,让同样的函数名字根据不同的参数情况实现不同的调用。
🌰:
定义一个构造函数Person:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| function Person() { var args = arguments; if(typeof args[0] === "object" && args[0]) { if(args[0].name) { this.name = args[0].name; } if(args[0].age) { this.age = args[0].age; } } else { if(args[0]) { this.name = args[0]; } if(args[1]) { this.age = args[1]; } } }
|
给它设置原型并使用:
1 2 3 4 5 6 7 8 9
| Person.prototype.toString = function() { return "name" + this.name + ",age=" + this.age; }
var wanzi = new Person("wanzi",20); wanzi.toString();
var nunn = new Person({name: "Nunn", age: 20}); nunn.toString();
|
如此,我们在构造函数内部进行参数类型的判断,根据参数类型的不同,进行不同的操作。
调用基类方法
🌰:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| function Person(name) { this.name = name; }
function Student(name, className) { this.className = className; Person.call(this, name); } var wanzi = new Student("wanzi","Information02"); wanzi;
Person.prototype.init = function(){};
Student.prototype.init = function() { Person.prototype.init.apply(this, arguments); };
|
通过在子类中使用apply方法,来调用基类中的方法。
链式调用
链式调用最让人印象深刻的应该是在jQuery中。
让我们来模拟一下jQuery中的添加类的链式操作:
1 2 3 4 5 6 7 8 9 10 11
| function classManager() {
} classManager.prototype.addClass = function(str) { console.log("Class" + str + "added"); return this; };
var manager = new ClassManager(); manager.addClass("classA").addClass("classB") .addClass("classC");
|
链式调用的玄机就在于最后的return this。
模块化
扶额,写起模块化,还是有一种不知道该怎么表达的感觉。。。。。所以还是写代码吧。
有了模块化,我们就可以实现分工协作,可以自由地使用他人写好的代码,减少任务量,等等等等。。。。。
模块化本身是有一些类库的,但是模块化这个其实我们自己也是可以来试一试的~~~
🌰:
1 2 3 4 5 6 7 8 9
| var moduleA; moduleA = function() { var prop = 1; function func() {}; return { func: func, prop: prop } }();
|
或者:
1 2 3 4 5 6 7
| var moduleA; moduleA = new function() { var prop = 1; function func() {}; this.func = func; this.prop = prop; };
|
如此如此,我们就手动了模块化。
更加成熟的模块化,我们还是需要借助一些库的。
总结
终于把oop这块整完了。
然后接下来就是对正则表达式做总结啦~~加油加油^_^。