js面向对象程序设计之继承

在面向对象语言中继承分成两种:接口继承和实现继承。解释一下,接口继承只继承方法的签名,而实现继承则是继承实际的方法。但是ECMAScript中的函数没有签名所以无法进行接口继承,只能是实现实现继承。而实现继承通常是依赖与原型链的。

原型链继承

原型的概念已经在上一篇中说过了。还是来简单的回顾一下构造函数,原型和实例的关系:每个构造函数都有一个圆形对象,原型对象都包含一个指向构造函数的指针,而实例都包含一个指向原型对象的内部指针。但是如果让一个构造函数的原型指针指向另一个对象。那么这时的原型对象将包含一个指向另一个的原型的指针,如果层层递进的话就形成了原型链。

function SupType(){
    this.property=true;
}

SupType.prototype.getSupValue=function(){
    return this.property;
}

function SubType(){
    this.subproperty=false;
}

SubType.prototype=new SupType();

SubType.prototype.getSubValue=function(){
    return this.subproperty;
}

var instace=new SubType();
alert(instace.getSupValue());

这就是上面代码的原型图解。可以看到SubType的Prototype是指向一个SuperType的实例。SubTypePrototype并没有所谓的构造函数。这就是原型链的继承。当然不要忘记SuperType也是继承Object的。

可以用两个方式来进行判断原型和实例之间的关系。第一中是 instanceof操作符。

alert(instace instanceof Object);
alert(instace instanceof SubType);
alert(instace instanceof SupType);

返回为true则为实例是原型链中出现过的构造函数。

还有一种就是isPrototypeof()方法。

alert(Object.prototype.isPrototypeOf(instace));
alert(SubType.prototype.isPrototypeOf(instace));
alert(SupType.prototype.isPrototypeOf(instace));

原型链和原型模式的构造函数有着一样的缺点,所有的引用值类型会被所有的实例所引用。而且不能给父类的构造函数传参数。所以就会借用构造函数的方法以组合的方法进行函数的继承。

借用构造函数的方式

其实这种原理十分简单就是在子类型的构造函数内部调超类型的构造函数。

function SupType(){
    this.colors=["red","blue","green"];
}

function SubType(){
    SupType.call(this);
}

var instance1=new SubType();

instance1.colors.push("black");
alert(instance1.colors);

var instance2=new SubType();
alert(instance2.colors);

在上面的代码中,在instance1中new的时候this就是intance1,然后调用了父类SupType的构造函数,在this的属性上添加了colors的属性。然后返回给instance1。这样每个实例都有独立的colors属性。

组合继承

顾名思义就是将使用原型链和构造函数两种进行组合继承。

function SupType(name){
        this.name=name;
        this.colors=["red","blue","green"];
}

SubType.prototype.sayName=function(){
    alert(this.name);
}

function SubType(name,age)
{
    SupType.call(this,name);
    this.age=age;
}

SubType.prototype=new SupType();
SubType.prototype.constructor=SubType;
SubType.prototype.sayAge=function(){
    alert(this.age);
}

在上面的代码中,需要共享的就添加到父类的原型中如方法SayName,不需要共享的就添加到构造函数中。在子类的构造函数中会有调用父类的构造函数,而且能传入参数。进行参数的初始化。这是JavaScript中最常用的继承模式。

寄生模式

时间: 2024-11-05 21:18:30

js面向对象程序设计之继承的相关文章

面向对象程序设计-继承与多态

前面我们讨论了如何在 JavaScript 语言中实现对私有实例成员.公有实例成员.私有静态成员.公有静态成员和静态类的封装.这次我们来讨论一下面向对象程序设计中的另外两个要素:继承与多态. 1 又是几个基本概念 为什么要说又呢? 在讨论继承时,我们已经列出了一些基本概念了,那些概念是跟封装密切相关的概念,今天我们要讨论的基本概念,主要是跟继承与多态相关的,但是它们跟封装也有一些联系. 1.1 定义和赋值 变量定义是指用 var a; 这种形式来声明变量. 函数定义是指用 function a(

js面向对象程序设计之构造函数

再上一篇的开头说了创建对象的两种方式,一种是Object构造函数的方式,一种是对象字面量的方法.但这些方式创建多个对象的时候都会产生大量的重复代码.经过技术的进步也演化出来许多的创建对象的模式.本章会介绍 工厂模式,原型模式,构造函数模式和构造函数与原型模式的混合使用. 1,工厂模式 工厂模式是一个比较广为人知的模式,这种模式将细节抽象出来.代码如下 function createPerson(name,age,job){ var o =new Object(); o.name=name; o.

JavaScript 对象的原型扩展(JS面向对象中的继承)

<script type="text/javascript"> function person(name, age) { this._name = name; this._age = age; var _self = this; this.say = function() { console.log(this._name + '-' + this._age); setTimeout(function() { console.log(_self._name); }, 2000

js面向对象程序设置——继承机制

//继承        //1.对象冒充            /*     function ClassA(sColor) {            this.color = sColor;            this.sayColor = function () {                alert(this.color);            };        }                function ClassB(sColor, sName) {        

python程序设计——面向对象程序设计:继承

继承是为代码复用和设计复用而设计的 在继承关系中,已有的.设计好的类称为父类或基类,新设计的类为子类或派生类 派生类可以继承父类的公有成员,但不能继承其私有成员 如果需要在派生类中调用基类的方法,可以使用内置函数super()或者通过 基类名.方法名() 实现 --------------------------------------------------------------------------- python支持多继承,如果父类中有相同的方法名,而在子类中使用时没有指定父类名, 则

浅谈JavaScript的面向对象程序设计(四)

本文继续讲解JavaScript的面向对象程序设计.继承是面向对象语言中的一个基本概念,面向对象语言支持两种继承实现方式:接口继承和实现继承.接口继承只继承方法签名,而实现继承则继承实际的方法.但是在JavaScript中函数时没有签名的,所以无法实现接口继承.JavaScript支持实现继承,而且其实现继承主要是通过原型链继承的. 原型链 JavaScript中有原型链的概念,并将原型链作为实现继承的主要方法.基本实现思想是让一个函数的原型继承另外一个函数的原型的属性和方法.每一个函数都有一个

JS面向对象的程序设计 - 高设

1 //工厂模式 2 function createPerson (name, age, job){ 3 var o = new Object(); 4 o.name = name; 5 o.age = age; 6 o.job = job; 7 8 o.sayName = function (){ 9 alert(this.name); 10 } 11 return o; 12 } 13 14 var sam = createPerson("sam", 18, "web f

JS面向对象(3) -- Object类,静态属性,闭包,私有属性, call和apply的使用,继承的三种实现方法

相关链接: JS面向对象(1) -- 简介,入门,系统常用类,自定义类,constructor,typeof,instanceof,对象在内存中的表现形式 JS面向对象(2) -- this的使用,对象之间的赋值,for...in语句,delete使用,成员方法,json对象的使用,prototype的使用,原型继承与原型链 JS面向对象(3) -- Object类,静态属性,闭包,私有属性, call和apply的使用,继承的三种实现方法 1.Object类 在JS中,Object是所有类的基

关于 JS 面向对象继承属性和方法的小例子

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title></title> </head> <body> <h1>关于 JS 面向对象继承属性和方法的小例子</h1> </body> </html> <script> //人的构造函