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

JS base knowledge (1) - protoype, _proto_,继承
Javascript OO - Inheritance

JS的OO特性中包括继承,封装。
实现方式有 原型继承,构造函数继承,组合继承等

(一)原型继承 - prototype chain - 原型链
prototype: 每个JS function 都拥有一个prototype对象,包含可以被实例共享的属性和方法。
_proto_: 每个对象都有一个_proto_属性。但有些浏览器隐藏了该属性。
实例对象的_proto_指向其构造函数的prototype对象。

下面一段代码实现了test.sub继承test.super的方法f1().
//命名空间
test = {};
//父类
test.super1 = function(){}
test.super1.prototype.f1 = function(){//}
//子类
test.sub = function(){}
test.sub.prototype = new test.super1(); 
// 函数sub的prototype指向super1的实例,也就间接指向了super1.prototype.

var subInst = new test.sub();


原理如图:


(二)构造函数继承
原型继承存在一个缺点,如果父类原型中的属性为引用类型时,当该引用类型值改变时,就引起了所有实例中的值发生改变。

解决这个问题可以ca

(三) 组合式继承

用prototype实现继承的时候,需要在子类的构造函数中调用父类的构造方法。
通过调用父类构造方法,子类实例拥有了父类属性的唯一拷贝。不管是基本类型还是引用类型。
这样对类变量的修改不会影响到各个实例。

参考:
http://mckoss.com/jscript/object.htm