面向对象与原型(三)

继承:

继承是面向对象中一个比较核心的概念。其他正统面向对象语言都会用两种方式实现继

承: 一个是接口实现, 一个是继承。 而ECMAScript只支持继承, 不支持接口实现,而实

现继承的方式依靠原型链完成。

function Box(){                       //Box构造
             this.name=‘Lee‘;
       }
       function Desk(){                    //Desk构造
             this.age=100;
       }
       Desk.prototype=new Box();           //Desc继承了Box, 通过原型, 形成链条
       var desk=new Desk();
       alert(desk.age);
       alert(desk.name);              //得到被继承的属性
       function Table(){               //Table构造
             this.level=‘AAAAA‘;
       }
      Table.prototype=new Desk(); //继续原型链继承
      var table=new Table();
      alert(table.name);               //继承了Box和Desk

                                                 原型链继承图

在JavaScript里,被继承的函数称为超类型(父类,基类也行,其他语言叫法),继承的函数称为

子类型(子类,派生类)。继承也有之前问题,比如字面量重写原型会中断关系, 使用引用类型的原型

,并且子类型还无法给超类型传递参数。为了解决引用共享和超类型无法传参的问题,我们采用一种

叫借用构造函数的技术,或者成为对象冒充(伪造对象、经典继承)的技术来解决这两种问题。

function Box(age){

this.name=[‘Lee‘,‘Jack‘,‘Hello‘]

this.age=age;

}

function Desk(age){

Box.call(this,age);       //对象冒充,给超类型传参

}

var desk = new Desk(200);

alert(desk.age);

alert(desk.name);

desk.name.push(‘AAA‘);    //添加的新数据,只给 desk

alert(desk.name);

借用构造函数虽然解决了刚才两种问题, 但没有原型, 复用则无从谈起。 所以, 我们需要

原型链+借用构造函数的模式,这种模式成为组合继承。

function Box(age) {

this.name = [‘Lee‘, ‘Jack‘, ‘Hello‘]

this.age = age;

}

Box.prototype.run = function () {

return this.name + this.age;

};

function Desk(age) {

Box.call(this, age); //对象冒充

}

Desk.prototype = new Box(); //原型链继承

var desk = new Desk(100);

alert(desk.run());

还有一种继承模式叫做:原型式继承;这种继承借助原型并基于已有的对象创建新对象,

同时还不必因此创建自定义类型。

function obj(o) { //传递一个字面量函数

function F() {} //创建一个构造函数

F.prototype = o; //把字面量函数赋值给构造函数的原型

return new F(); //最终返回出实例化的构造函数

}

var box = { //字面量对象

name : ‘Lee‘,

arr : [‘哥哥‘,‘妹妹‘,‘姐姐‘]

};

var box1 = obj(box); //传递

alert(box1.name);

box1.name = ‘Jack‘;

alert(box1.name);

alert(box1.arr);

box1.arr.push(‘父母‘);

alert(box1.arr);

var box2 = obj(box); //传递

alert(box2.name);

alert(box2.arr); //引用类型共享了

寄生式继承把原型式+工厂模式结合而来,目的是为了封装创建对象的过程。

function create(o) { //封装创建过程

var f= obj(o);

f.run= function () {

return this.arr; //同样,会共享引用

};

return f;

}

组合式继承是 JavaScript最常用的继承模式; 但, 组合式继承也有一点小问题, 就是超

型在使用过程中会被调用两次: 一次是创建子类型的时候, 另一次是在子类型构造函数的部。

function Box(name) {

this.name = name;

this.arr = [‘哥哥‘,‘妹妹‘,‘父母‘];

}

Box.prototype.run= function() {

returnthis.name;

};

function Desk(name, age) {

Box.call(this, name); //第二次调用 Box

this.age = age;

}

Desk.prototype = newBox(); //第一次调用 Box

以上代码是之前的组合继承,那么寄生组合继承,解决了两次调用的问题。

function obj(o) {

functionF() {}

F.prototype= o;

return new F();

}

function create(box,desk){

var f=obj(box.prototype);

f.constructor=desk;

desk.prototype=f;

}

function Box(name){

this.name=name;

this.arr=[‘哥哥‘,‘妹妹‘,‘父母‘];

}

Box.prototype.run=function(){

return this.name;

};

function Desk(name,age){

Box.call(this,name);

this.age=age;

}

create(Box,Desk); //通过这里实现继承

var desk=new Desk(‘Lee‘,100);

desk.arr.push(‘姐姐‘);

alert(desk.arr);

alert(desk.run()); //只共享了方法

var desk2=new Desk(‘Jack‘,200);

alert(desk2.arr); //引用问题解决

时间: 2024-11-01 20:52:32

面向对象与原型(三)的相关文章

JS面向对象与原型

面向对象与原型一.创建对象 1.基本方法 1 var box = new Object(); //创建对象 2 box.name = 'Lee'; //添加属性 3 box.age = 100; 4 box.run = function(){ //添加方法 5 return this.name + this.age + '运行中...'; //this表示当前作用于下的对象 6 }; 7 8 alert(box.run()); 9 10 alert(this.anme); //这里的this代表

第一百零九节,JavaScript面向对象与原型

JavaScript面向对象与原型 学习要点: 1.学习条件 2.创建对象 3.原型 4.继承 ECMAScript有两种开发模式:1.函数式(过程化),2.面向对象(OOP).面向对象的语言有一个标志,那就是类的概念,而通过类可以创建任意多个具有相同属性和方法的对象.但是,ECMAScript没有类的概念,因此它的对象也与基于类的语言中的对象有所不同.   一.学习条件 在JavaScript视频课程第一节课,就已经声明过,JavaScript课程需要大量的基础.这里,我们再详细探讨一下: 1

【JavaScript】——剖析面向对象与原型(一)

在面向对象与原型一章中,感觉还是挺有意思的,而且视频讲解的也很清楚,在这里总结归纳一下视频里 讲的内容,顺便整理整理自己的思路. 首先画一张图,理一下这一整章的知识点. 下面针对具体的知识点去剖析各个知识点间的关系: 工厂模式 工厂模式的引出,是为了避免在创建对象过程中产生大量重复的问题.它封装了在创建对象过程一些重复 的代码,避免了代码冗余.举个简单的Demo: 1.普通的创建对象: var p=new Object(); p.name='王虹芸'; alert('姓名:'+p.name);

十一、面向对象与原型

十一.面向对象与原型 ECMAScript有两种开发模式:1.函数式(过程化),2.面向对象(OOP).面向对象的语言有一个标志,那就是类的概念,而通过类可以创建任意多个具有相同属性和方法的对象.但是,ECMAScript没有类的概念,因此它的对象也与基于类的语言中的对象有所不同.   1.学习条件 在JavaScript视频课程第一节课,就已经声明过,JavaScript课程需要大量的基础.这里,我们再详细探讨一下: 1.xhtml基础:JavaScript方方面面需要用到. 2.扣代码基础:

javascript面向对象系列第三篇——实现继承的3种形式

前面的话 学习如何创建对象是理解面向对象编程的第一步,第二步是理解继承.开宗明义,继承是指在原有对象的基础上,略作修改,得到一个新的对象.javascript主要包括类式继承.原型继承和拷贝继承这三种继承方式.本文是javascript面向对象系列第三篇——实现继承的3种形式 类式继承 大多数面向对象的编程语言都支持类和类继承的特性,而JS却不支持这些特性,只能通过其他方法定义并关联多个相似的对象,如new和instanceof.不过在后来的ES6中新增了一些元素,比如class关键字,但这并不

【Java面向对象基础(三)】面向对象思想

[喵"的Android之路][基础篇(三)][Java面向对象基础]面向对象思想 1 面向对象的WWH 1.1 What--什么是面向对象 首先,要理解“对象”.在Thinking in Java中提到“Everything is an object”,即万物皆对象.这里的“对象”指的是任何实体或者任何可以当作实体看待的“虚幻的事物”.比如现实中的人(男人.女人.老人.小孩而...).动物(大象.狮子.猴子...).桌子.凳子.汽车.ATM机等等,也可以使看不见摸不着的空气(氧气.二氧化碳.氮气

面向对象与原型4---原型

原型模式创建对象也有自己的缺点,它省略了构造函数传参初始化这一过程,带来的缺点就是初始化的值都是一致的.而原型最大的缺点就是它最大的优点,那就是共享.原型中所有属性是被很多实例共享的,共享对于函数非常合适,对于包含基本值的属性也还可以.但如果属性包含引用类型,就存在一定的问题: 1. //原型的缺点 function Box() {};Box.prototype = {constructor : Box,name : 'Lee',age : 100,family : ['父亲', '母亲', '

JAVA学习--面向对象的特征三:多态性

* 面向对象的特征三:多态性  * 1.多态性指的是什么?多态性,可以理解为一个事物的多种表型形态.  *   1)方法的重载与重写  2)子类对象的多态性  *  * 2.子类对象的多态性使用的前提:①要有类的继承②要有子类对父类方法的重写  *  * 3.程序运行分为编译状态和运行状态.  *   对于多态性来说,编译时,"看左边",将此引用变量理解为父类的类型  *   运行时,"看右边",关注于真正对象的实体:子类的对象.那么执行的方法就是子类重写的.  *

面向对象与原型5---继承

1.用原型链实现继承 最普通 但是没有办法传参,没有办法共享方法 继承是面向对象中一个比较核心的概念.其他正统面向对象语言都会用两种方式实现继承:一个是接口实现,一个是继承.而 ECMAScript 只支持继承,不支持接口实现,而实现继承的方式依靠原型链完成. 原型链是由原型加对象构造之间的关系结构形成的像一个链条一样 在 JavaScript 里,被继承的函数称为超类型(父类,基类也行,其他语言叫法),继承的函数称为子类型(子类,派生类). //继承,通过原型链实现 function Box(

面向对象与原型2---原型

1. 我们创建的每个函数(或称构造函数或对象)都有一个 prototype(原型)属性,这个属性是一个对象(这个对象下有个prototype属性,而这个属性其实是另外一个对象的引用,这个属性就是一个对象),它的用途是 包含可以由特定类型的所有实例共享的属性和方法(prototype共享放到其中的属性和方法,无论实例化多少对象,属性和方法都是共享的.这样有好处也有坏处.).逻辑上可以这么理解:prototype 通过调用构造函数而创建的那个对象的原型对象.使用原型的好处可以让所有对象实例共享它所包