如果我们想要父类的某个属性的,但是又不想全部都继承过来的话,我们要怎么做呢?
function Person(name) {
this.name = name;
}
function Teacher(name,books) {
//调用父类的构造函数
Person.call(this,name);
//为自己的属性赋值
this.books= books;
}
//这两步不能省
Teacher.prototype = new Person();
Teacher.prototype.constructor = Teacher;
Teacher.prototype.show= function(){
document.write(this.name+"喜欢看"+this.books);
}
var peter = new Teacher("hjm","英语");
peter.show();
但是这样的写的话就会很麻烦。如何有多个类都实现了继承了那要怎么办呢?下面的代码实现了藕耦合。
function extend(subClass,superClass){
//1.定义一个中间空对象,为了转换主夫类关系
var F = function () {}
F.prototype = superClass.prototype;
//2.让子类继承F
subClass.prototype = new F();
subClass.prototype.constructor = subClass;
//3.为子类添加父类的属性
subClass.superClass = superClass.prototype;
//4.增加保险
if(superClass.prototype.constructor== Object.prototype.constructor)
{
superClass.prototype.constructor=superClass;
}
}
function Author(name,books){
Author.superClass.constructor.call(this,name);
//Person.call(this,name); 当我想随意改变一个父类的话,上面写法更有高效性
this.books = books;
this.getBooks = function(){
document.write(this.name +"->"+this.books);
}
}
extend(Author,Person);
var peter = new Author("小红 ","数学");
peter.getBooks();//小红 ->数学
什么是松藕合
很多设计模式就是为了解决紧耦合的问题。如果两个组件耦合太紧,则说明一个组件和另一个组件直接相关,这样的话,如果修改一个组件的逻辑,那么另外一个组件的逻辑也需修改。比如,假设有一个名为error的CSS类名,它是贯穿整个站点的,它被嵌入到HTML之中。如果有一天你觉得error的取名并不合适,想将它改为warning,你不仅需要修改CSS还要修改用到这个className的HTML。HTML和CSS紧耦合在一起。这只是一个简单的例子。想象一下,如果一个系统包含上百个组件,那这简直就是一场噩梦。
当你能够做到修改一个组件而不需要更改其他的组件时,你就做到了松耦合。对于多人大型系统来说,有很多人参与维护代码,松耦合对于代码可维护性来说至关重要。你绝对希望开发人员在修改某部分代码时不会破坏其他人的代码。
当一个大系统的每个组件的内容有了限制,就做到了松耦合。本质上讲,每个组件需要保持足够瘦身来确保松耦合。组件知道的越少,就越有利于形成整个系统。
有一点需要注意:在一起工作的组件无法达到"无耦合"(no coupling)。在所有系统中,组件之间总要共享一些信息来完成各自的工作。这很好理解,我们的目标是确保对一个组件的修改不会经常性地影响其他部分。
如果一个Web UI是松耦合的,则很容易调试。和文本或结构相关的问题,通过查找HTML即可定位。当发生了样式相关的问题,你知道问题出现在CSS中。最后,对于那些行为相关的问题,你直接去JavaScript中找到问题所在,这种能力是Web界面的可维护性的核心部分。