最近有些想看点技术书籍,这两天看了下javascript的设计模式,觉得里面的继承挺有意思的。javascript不像C++、java这些语言有已有的继承方式,它的继承需要自己去用代码实现。
仿照其它语言实现继承的函数如下:
function SuperClass(value){ alert("SuperClass:\t" + value); } function SubClass(value){ SubClass.superclass.constructor.call(this, value); alert("SubClass\t" + value); } function extend(subClass, superClass){ var F = function(){};//增加一个空函数F,并将用它创建的对象实例插入原型链中,这样做可以避免创建超类的 //新实例,因为它可能比较庞大。 F.prototype = superClass.prototype; subClass.prototype = new F(); subClass.prototype.constructor = subClass; subClass.superclass = superClass.prototype; if(superClass.prototype.constructor == Object.prototype.constructor){ superClass.prototype.constructor = superClass; } } extend(SubClass, SuperClass); new SubClass(123);
这个是模仿其他语言实现的继承代码。关于里面的Constructor解释一下:定义一个构造函数是,其默认的prototype对象是一个Object类型的实例,其constructor属性会默认设置成构造函数本身。如果手工将其prototype设置为另一个对象,那么新对象自然不会具有原对象的constructor值,所有需要重新设置其constructor属性。
原型式继承
var Person = {
name : "Default value",
getName : function(){
return this.name;
}
}
function clone(object){
var F = function(){};
F.prototype = object;
return new F();
}
var reader= clone(Person);
alert(reader.getName());
reader.name = "Mr Yang";
alert(reader.getName());
var Author = clone(Person);
Author.books = [];
Author.getBooks = function(){
return this.books;
}
var author = [];
author[0] = clone(Author);
author[0].name = "Dustin Diaz";
author[0].books = ["Javascript Design Patterns"];
author[1] = clone(Author);
author[1].name = "Ross Harmes";
author[1].books = ["Javascript Design Patterns"];
alert(author[1].getName());
alert(author[1].getBooks());
clone函数可以用来创建新的类Person对象,他会创建一个空对象,而该对象的原型对象被设置成为Person,这意味着
在新对象中查找属性或者方法时,如果找不到,那么查找过程会在其原型对象上查找。
原型式继承中,不论是继承还是创建新的对象,都是通过clone函数实现的。
原型式继承对继承而来的成员的读和写具有不对等行。一个克隆并非其原型对象的一份完全独立的副本,它只是一个以那个对象为原型对象的空对象而已。克隆刚被创建时,author[1].name其实是一个返回最初的Person.name的链接,对于从原型对象继承而来的成员,其读和写具有内在的不对等性。