JavaScript学习13 JavaScript中的继承

JavaScript学习13 JavaScript中的继承

继承第一种方式:对象冒充

<script type="text/javascript">

//继承第一种方式:对象冒充

function Parent(username) //父类对象
{
    this.username = username; //下面的代码最关键的部分就是将子对象的this传递给了父对象

    this.sayHello = function()
    {
        alert(this.username);
    }
}

function Child(username, password) //子类对象
{
    //下面三行代码是最关键的代码
    this.method = Parent; //定义method属性,指向Parent,即指向了上面的构造函数
    this.method(username);//把username传递过去,调用构造函数,此时Parent函数体中的this即当前的Child对象
    delete this.method; //删掉method属性,因为Child已经具备了Parent的属性和方法

    //下面可以增加一些子类特有的属性和方法
    this.password = password;

    this.sayWorld = function()
    {
        alert(this.password);
    }
}

//生成这两个类的对象
var parent = new Parent("zhangsan");
var child = new Child("lisi", "1234");

parent.sayHello();

child.sayHello();
child.sayWorld();

</script>

  

  使用这种方式实现继承的时候,JS可以实现多重的继承,但是有时候会造成一些干扰,比如同名方法的覆盖,所以不太推荐使用多继承。

继承第二种方式:call方法方式

  call方法是定义在Function对象中的方法,因此我们定义的每个函数都有该方法。

  可以通过函数名来调用call方法,call方法的第一个参数会被传递给函数中的this,从第二个参数开始,逐一赋值给函数中的参数

  call方法

<script type="text/javascript">

//call方法方式,Function对象中的方法

function test(str, str2)
{
    alert(this.name + ", " + str + ", " + str2);
}

var object = new Object();
object.name = "zhangsan";

//test.call相当于调用了test函数
test.call(object, "shengsiyuan", "hello"); //将object赋给了this
//第一个参数赋给this,后面的参数逐次赋给方法参数

</script>

  call方法实现继承

<script type="text/javascript">

//使用call方式实现对象的继承

function Parent(username)
{
    this.username = username;

    this.sayHello = function()
    {
        alert(this.username);
    }
}

function Child(username, password)
{
    Parent.call(this, username);//这样语句很关键,等价于对象冒充中的三行语句
    //执行之后子类就具有了基类的属性和方法

    //子对象的新增属性和方法
    this.password = password;

    this.sayWorld = function()
    {
        alert(this.password);
    }
}

var parent = new Parent("zhangsan");

var child = new Child("lisi", "123");

parent.sayHello();

child.sayHello();
child.sayWorld();

</script>

继承第三种方式:apply方法方式

  apply和call一样,都是定义在Function对象里面的。

<script type="text/javascript">

//使用apply方法实现对象继承

function Parent(username)
{
    this.username = username;

    this.sayHello = function()
    {
        alert(this.username);
    }
}

function Child(username, password)
{
    Parent.apply(this, new Array(username));//apply方法方式实现继承,后面的参数以数组的形式传入

    this.password = password;

    this.sayWorld = function()
    {
        alert(this.password);
    }
}

var parent = new Parent("zhangsan");
var child = new Child("lisi", "123");

parent.sayHello();

child.sayHello();
child.sayWorld();

</script>

继承第四种方式:原型链方式

<script type="text/javascript">

//使用原型链(prototype chain)方式实现对象继承

function Parent()
{

}

Parent.prototype.hello = "hello";
Parent.prototype.sayHello = function()
{
    alert(this.hello);
}

function Child()
{

}

Child.prototype = new Parent();//子类具有父类的属性和方法
//扩展属性
Child.prototype.world = "world";
Child.prototype.sayWorld = function()
{
    alert(this.world);
}

var child = new Child();

child.sayHello();
child.sayWorld();

</script>

  原型链的方式,缺点是无法给构造函数传递参数。

继承的第五种方式:混合方式

  这种方式是对原型链方式的一种改进,使得可以向构造函数传递参数。

  这种方式是比较推荐的一种方式。

<script type="text/javascript">

//使用混合方式实现对象继承(推荐)
//父对象
function Parent(hello)
{
    this.hello = hello;
}

Parent.prototype.sayHello = function()
{
    alert(this.hello);
}
//子对象
function Child(hello, world)
{
    Parent.call(this, hello);//通过call实现属性的继承

    this.world = world;//新增加的属性
}

Child.prototype = new Parent();//通过原型链实现方法的继承

Child.prototype.sayWorld = function()
{
    alert(this.world);
}

var child = new Child("hello", "world");

child.sayHello();
child.sayWorld();

</script>

实例

<script type="text/javascript">

function Shape(edge)
{
    this.edge = edge;//属性,多少条边,通过构造函数的方式定义
}

Shape.prototype.getArea = function()//通过原型的方式来定义方法
{
    return -1;//基类返回一个没有意义的值
}

Shape.prototype.getEdge = function()
{
    return this.edge;
}

//定义子对象Triangle
function Triangle(bottom, height)
{
    Shape.call(this, 3);

    //Triangle的属性
    this.bottom = bottom;
    this.height = height;
}

Triangle.prototype = new Shape();//继承Shaple中的所有方法

Triangle.prototype.getArea = function()//重写方法
{
    return 0.5 * this.bottom * this.height;
}

var triangle = new Triangle(10, 4);

//alert(triangle.getEdge());
//alert(triangle.getArea());

//另一个子类:四边形
function Rectangle(bottom, height)
{
    Shape.call(this, 4);

    this.bottom = bottom;
    this.height = height;
}

Rectangle.prototype = new Shape();//通过原型继承父类的所有方法

Rectangle.prototype.getArea = function()//覆写方法
{
    return this.bottom * this.height;
}

var rectangle = new Rectangle(20, 40);

alert(rectangle.getEdge());
alert(rectangle.getArea());

</script>

参考资料

  圣思园张龙老师Java Web系列视频教程。

时间: 2024-10-05 04:40:53

JavaScript学习13 JavaScript中的继承的相关文章

JavaScript学习12 JS中定义对象的几种方式

JavaScript学习12 JS中定义对象的几种方式 JavaScript中没有类的概念,只有对象. 在JavaScript中定义对象可以采用以下几种方式: 1.基于已有对象扩充其属性和方法 2.工厂方式 3.构造函数方式 4.原型("prototype")方式 5.动态原型方式 一.基于已有对象扩充其属性和方法 <script type="text/javascript"> var object = new Object(); object.name

JavaScript学习笔记——jquery中html()、text()、val()的区别

.html()用为读取和修改元素的HTML标签 .text()用来读取或修改元素的纯文本内容 .val()用来读取或修改表单元素的value值. 这三个方法功能上的对比 .html(),.text(),.val()三种方法都是用来读取选定元素的内容:只不过.html()是用来读取元素的HTML内容(包括其Html标签),.text()用来读取元素的纯文本内容,包括其后代元素,.val()是用来读取表单元素的"value"值.其中.和.text()方法不能使用在表单元素上,而.val()

JavaScript学习12 JS中定义对象的几种方式【转】

avaScript学习12 JS中定义对象的几种方式 转自:  http://www.cnblogs.com/mengdd/p/3697255.html JavaScript中没有类的概念,只有对象. 在JavaScript中定义对象可以采用以下几种方式: 1.基于已有对象扩充其属性和方法 2.工厂方式 3.构造函数方式 4.原型("prototype")方式 5.动态原型方式 一.基于已有对象扩充其属性和方法 <script type="text/javascript

JavaScript学习笔记————JavaScript的应用环境

JavaScript的应用环境,主要是宿主环境(host environment)和运行期环境构成.其中,宿主环境是指外壳程序(Shell)和Web浏览器等,而运行期环境则是由JavaScript引擎内建的. 宿主环境 宿主环境是为了隔离代码.语言与具体的平台而提出的一种设计.一方面我们不能让浏览器拥有一个巨大无比的运行期环境(虚拟机就是拥有特别大的运行期环境的一个平台),另一方面服务器端又需要较强大的环境,由此JavaScript就被设计为"宿主环境"的语言. ECMAScript规

JavaScript学习笔记(三)—— 继承的实现

一.JavaScript实现继承的三层含义:   ① 子类的实例可以共享父类的方法: ② 子类可以覆盖父类的方法或者扩展新的方法: ③ 子类和父类都是子类的实例. 二.实现继承的几种方法: 1.原型链继承 例:function Box( ){           //被继承的函数叫超(父)类型: this.name = “Andy”; } function Desk( ){           //继承的函数叫子类型 this.age = 25; } Desk.prototype = new B

JavaScript学习笔记(散)——继承、构造函数super

构造函数中的super 今天看<JavaScript设计模式与开发实践>时,在书中看到一段代码出现super语句,第一次看到这个关键字,所以上网查了下它的作用,发现这个关键字是来自java,来源不深究,说说它的用途.super主要作用是调用父级的构造函数,但是困惑的是既然是构造函数,说明在声明的时候已经调用了,为什么会出现super来调用?自己敲了段代码加深了理解,上图: 这里创建了一个animal类,包含一个构造函数 接下来创建animal的子类Dog,含有一个speak函数(用于理解继承)

JavaScript学习13:事件绑定

事件绑定分为两种:一种是传统事件绑定(内联模型.脚本模型),一种是现代事件绑定(DOM2级模型).现代事件绑定在传统绑定的基础上为我们提供了更强大更方便的功能. 传统事件绑定的问题 因为内联模型很少用,这里不做讨论.先来看一下脚本模型,将一个函数赋值给一个事件处理函数. <span style="font-size:18px;">var box=document.getElementById('box'); box.onclick=function(){ alert('Li

JavaScript学习3:原型和继承

原型 我们创建的每个函数都有一个prototype(原型)属性,这个属性是一个对象,它的用途是包括能够由特定类型的全部实例共享的属性和方法.逻辑上能够这么理解:prototype是通过调用构造函数而创建的那个对象的原型对象. 为什么要引入原型的概念呢?使用原型的目的.也是他的优点是能够让全部的对象实例共享它所包括的属性和方法.换句话说,就是不必再构造函数中定义对象信息,而是能够直接将这些信息加入到原型中. 详细怎么用,我们来看代码实例: <span style="font-size:18p

JavaScript学习总结1--JavaScript中的数据类型

1.基本类型值在内存中占据固定大小的空间,因此被保存在栈内存中 例如: var a=1; var b="hello world"; 2.从一个变量向另一个变量赋值基本类型的值,会创建这个值的一个副本 例如: var b="JavaScript"; var c=b; 3.引用类型的值是对象,保存在堆内存中 4.包含引用类型值的变量实际上包含的并不是对象本身,而是一个指向该对象的指针 5.从一个变量向另一个变量赋值引用类型的值,复制的其实是指针,因此两个变量最终都指向同