javascript关于继承的用法汇总


Posted in Javascript onDecember 20, 2014

本文实例汇总了javascript关于继承的用法。分享给大家供大家参考。具体如下:

例子:

/**

* 实现子类继承父类,但不会产生多余的属性和方法

* @returns {Function}

*/

define(function(){

return function(subType, superType){

var proto = new Object(superType.prototype);

proto.constructor = subType;

subType.prototype = proto;

};

});

//——————————————————————————

define(function(){

function ostring(s)

{

this.str = s;

this.length = this.str.length;

}

ostring.prototype.show = function(){

alert(this.str);

};

return ostring;

});

//——————————————————————————

define(['inherit', 'ostring'], function(inherit, ostring){

function wstring(s){

//用call实现调用父类构造函数

ostring.call(this, s);

this.chlength = 2 * s.length;

}

//继承其他的属性

inherit(wstring, ostring);

wstring.prototype.add = function(w)

{

alert(this.str + w);

};

return wstring;

});

再看例子
一、用function实现:

function Person(name) {

    this.name = name;

}

Person.prototype.getName = function() {

    return this.name;

}

function Author(name, books) {

    this.inherit=person;

    this.inherit(name);

    this.books = books;

    

}

var au=new Author("dororo","Learn much");

au.name

或者同等效力的:
function Person(name) {

    this.name = name;

}

Person.prototype.getName = function() {

    return this.name;

}

function Author(name, books) {

    Person.call(this, name);

    this.books = books;

    

}

var au=new Author("dororo","Learn much");

au.getName

由于这只是将this作为参数,调用父类Person的构造函数,把赋予父类的所有域赋予Author子类,所以任何父类Person构造函数之外的定义的域(原型prototype),子类都不会继承。所以上面例子中,au.getName将是没有被定义的(undefined),因为getName是在Person的原型对象中定义的。

而且,子类的构造函数要在定义自己的域之前调用父类构造函数,免得子类的定义被父类覆盖掉。也就是说,Author定义属性book要在Person.call之后,否则会被Person中属性覆盖。同时,在子类中也最好不要用prototype来定义子类的函数域,因为在一个子类被new,实例化之后就要执行prototype,然后才是调用父类的构造函数,这样也容易被父类的属性覆盖掉。

二、用prototype实现:

function Person(name) {

    this.name = name;

}

Person.prototype.getName = function() {

    return this.name;

}

function Author(name, books) {

    this.books = books;  

}

Author.prototype=new Person(name);

Author.prototype.constructor=Author;

Author.prototype.getBooks = function() {

    return this.books;

}

var au1=new Author("dororo1","Learn much");

var au2=new Author("dororo2","Learn less");

alert(au1.getName());

alert(au2.getName());

这种方法避免了function实现中,无法继承prototype的问题。因为 Author.prototype=new Person(name);new Person()实例会调用Person构造和原型的所有属性。但是缺点是已经实例化了Author.prototype。所以当子类实例化的时候,所有非基本数据类型都是reference copy。所以上面例子中,无论实例au1,还是au2返回的值都是dororo1.

三、用“混合”实现

function Person(name) {

    this.name = name;

}

Person.prototype.getName = function() {

    return this.name;

}

function Author(name, books) {

    this.base = new Person(name);

    for(var key in this.base){

        if(!this[key]){

           this[key]=this.base[key];

           }

           }

    this.book=books;

}

var au1=new Author("dororo1","work");

var au2=new Author("dororo2","play");

alert(au1.getName());

alert(au2.getName());

au1.book;

au2.book;

 
属于扩展,把父类的所有域都拷贝到子类。完全没有上述两方面的问题。
寄生组合模式)

JS的继承包括属性的继承和方法的继承,他们分别通过不同的方法来实现。
1.属性的继承

属性的继承通过改变函数的执行环境来实现的。而改变函数的执行环境可以使用call()和apply()两种方法来实现。

我们首先创建一个Animal“类”(因为JS中没有类的概念,这里只是一个模拟,它实际上只是一个Function函数对象)。

function Animal(typeName) {

//为当前方法的执行环境(this)添加一个属性typeName

//但是执行环境(this)要执行这个函数的时候才能确定

this.typeName = typeName;

this.colors = ["red","while"];

}

//想函数的原型里 添加 两个(对象共享的)的方法

Animal.prototype.Shout = function () { alert("我是:--" + this.typeName);};

Animal.prototype.Eat = function () { alert("我是:--" + this.typeName) };

//--定义一个狮子--“类”(其实就是一个函数)

function Lion(tn) {

//--执行Animal方法,并通过apply的第一个参数 修改了Animal的执行环境为Lion的this

//同样的,Lion的this,也要在执行的时候才能确定是谁

Animal.apply(this,["狮子"]);//--继承了父类的变量属性,this因为是new了Lion,this是Lion

}

Lion.prototype = Animal.prototype; //继承父类的方法,搞定--但是这写不好,当子类再添加方法时候,父类同样也有此方法,这是指针引用

Lion.prototype.Hunt = function () {

alert("我是:狮子,我要去捕猎~~·~");

}

var aminm = new Animal();

aminm.Hunt(); //---可以访问到子类的方法,这样就不好了

//----那么如何解决这个问题呢》??????

//---解决方案:继承方法时候可以这样写:

Lion.prototype = new Animal();//继承父类的方法,把Animal对象赋给了prototype原型,其实它里面也有属性

var lion = new Lion(); //new 关键字除了创建的,还会修改Lion对象的执行环境为Lion对象本身

// ---换句话说,就是new完了之后,Lion函数里的this就是Lion函数本身了,然后调用Lion函数

分析一下new关键字:

而new关键字是十分伟大的,在上段代码中,new关键字完成了以下几项工作:
1)开辟堆空间,以准备存储Lion对象
2)修改Lion对象本身的执行环境,使得Lion函数的this指向了Lion函数对象本身。
3)调用Lion“类”的“构造函数”,创建Lion对象
4)将Lion函数对象的堆地址赋值给变量l,这个时候l就指向了这个Lion函数对象
lion.Shout();
lion.Eat();
但是这种继承有个缺点:就是父类的构造函数的被调用了两次,call一次,然后new又一次。

希望本文所述对大家的javascript程序设计有所帮助。

Javascript 相关文章推荐
User Scripts: Video Download by User Scripts
May 14 Javascript
一个基于jquery的图片切换效果
Jul 06 Javascript
关于javaScript注册click事件传递参数的不成功问题
Jul 18 Javascript
聊一聊JS中this的指向问题
Jun 17 Javascript
js 中文汉字转Unicode、Unicode转中文汉字、ASCII转换Unicode、Unicode转换ASCII、中文转换
Dec 06 Javascript
Javascript中的神器——Promise
Feb 08 Javascript
Ionic + Angular.js实现验证码倒计时功能的方法
Jun 12 Javascript
Router解决跨模块下的页面跳转示例
Jan 11 Javascript
vue发送ajax请求详解
Oct 09 Javascript
微信小程序API—获取定位的详解
Apr 30 Javascript
请求时token过期自动刷新token操作
Sep 11 Javascript
JavaScript 实现继承的几种方式
Feb 19 Javascript
jquery实现将获取的颜色值转换为十六进制形式的方法
Dec 20 #Javascript
jQuery的text()方法用法分析
Dec 20 #Javascript
jQuery中click事件的定义和用法
Dec 20 #Javascript
javascript中String对象的slice()方法分析
Dec 20 #Javascript
javascript中Number对象的toString()方法分析
Dec 20 #Javascript
javascript中parseInt()函数的定义和用法分析
Dec 20 #Javascript
JS+CSS实现弹出全屏灰黑色透明遮罩效果的方法
Dec 20 #Javascript
You might like
PHP 执行系统外部命令 system() exec() passthru()
2009/08/11 PHP
php程序之die调试法 快速解决错误
2009/09/17 PHP
PHP文件上传原理简单分析
2011/05/29 PHP
php提取身份证号码中的生日日期以及验证是否为成年人的函数
2015/09/29 PHP
PHP yii实现model添加默认值的方法(两种方法)
2016/11/10 PHP
Zend Framework使用Zend_Loader组件动态加载文件和类用法详解
2016/12/09 PHP
php实现数组纵向转横向并过滤重复值的方法分析
2017/05/29 PHP
php利用云片网实现短信验证码功能的示例代码
2017/11/18 PHP
PHP实现非阻塞模式的方法分析
2018/07/26 PHP
基于jquery的滚动新闻列表
2010/06/19 Javascript
jquery.bgiframe.js在IE9下提示INVALID_CHARACTER_ERR错误
2013/01/11 Javascript
js检验密码强度(低中高)附图
2014/06/05 Javascript
了不起的node.js读书笔记之node的学习总结
2014/12/22 Javascript
基于zepto.js实现仿手机QQ空间的大图查看组件ImageView.js详解
2015/03/05 Javascript
js实现适用于素材网站的黑色多级菜单导航条效果
2015/08/24 Javascript
JS与jQuery遍历Table所有单元格内容的方法
2015/12/07 Javascript
懒加载实现的分页&&网站footer自适应
2016/12/21 Javascript
js实现滑动到页面底部自动加载更多功能
2017/02/15 Javascript
Bootstrap里的文件分别代表什么意思及其引用方法
2017/05/01 Javascript
yarn的使用与升级Node.js的方法详解
2017/06/04 Javascript
jQuery 实现双击编辑表格功能
2017/06/19 jQuery
详解Vue.js组件可复用性的混合(mixin)方式和自定义指令
2017/09/06 Javascript
js get和post请求实现代码解析
2020/02/06 Javascript
快速了解Python开发中的cookie及简单代码示例
2018/01/17 Python
在tensorflow以及keras安装目录查询操作(windows下)
2020/06/19 Python
python中查看.db文件中表格的名字及表格中的字段操作
2020/07/07 Python
Python ellipsis 的用法详解
2020/11/20 Python
英国马莎百货官网:Marks & Spencer
2016/07/29 全球购物
选购世界上最好的美妆品:Cult Beauty
2017/11/03 全球购物
中学生差生评语
2014/01/30 职场文书
2014年百日安全生产活动总结
2014/05/04 职场文书
企业总经理任命书
2014/06/05 职场文书
师德师风主题教育活动总结
2015/05/07 职场文书
公司宣传语大全
2015/07/13 职场文书
开学第一周值周总结
2015/07/16 职场文书
Python学习之时间包使用教程详解
2022/03/21 Python