日期:2014-05-16  浏览次数:20456 次

Javascript的继承

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

?

?