日期:2014-05-16 浏览次数:20446 次
?????? 最近有些想看点技术书籍,这两天看了下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的链接,对于从原型对象继承而来的成员,其读和写具有内在的不对等性。
?
?