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 相关文章推荐
可缩放Reloaded-一个针对可缩放元素的复用组件
Mar 10 Javascript
JavaScript 读取元素的CSS信息的代码
Feb 07 Javascript
JS getStyle获取最终样式函数代码
Apr 01 Javascript
jquery常用技巧及常用方法列表集合
Apr 06 Javascript
详解javascript实现自定义事件
Jan 19 Javascript
基于javascript实现简单的抽奖系统
Apr 15 Javascript
倾力总结40条常见的移动端Web页面问题解决方案
May 24 Javascript
chrome浏览器如何断点调试异步加载的JS
Sep 05 Javascript
JS数组操作中的经典算法实例讲解
Jul 26 Javascript
vue2.0中set添加属性后视图不能更新的解决办法
Feb 22 Javascript
150行代码带你实现微信小程序中的数据侦听
May 17 Javascript
Vue elementUI表单嵌套表格并对每行进行校验详解
Feb 18 Vue.js
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中实现图片的锐化
2006/10/09 PHP
PHP中使用php5-ffmpeg撷取视频图片实例
2015/01/07 PHP
PHP数据的提交与过滤基本操作实例详解
2016/11/11 PHP
thinkPHP5 tablib标签库自定义方法详解
2017/05/10 PHP
javaScript对象和属性的创建方法
2007/01/15 Javascript
JavaScript 序列化对象实现代码
2009/12/18 Javascript
用jQuery实现一些导航条切换,显示隐藏的实例代码
2013/06/08 Javascript
JS实现跟随鼠标闪烁转动色块的方法
2015/02/26 Javascript
浅谈jquery选择器 :first与:first-child的区别
2016/11/20 Javascript
Bootstrap基本样式学习笔记之按钮(4)
2016/12/07 Javascript
获取select的value、text值的简单示例(jquery与javascript)
2016/12/07 Javascript
jQuery、zepto、js常用小技巧
2017/02/12 Javascript
node.js中fs.stat与fs.fstat的区别详解
2017/06/01 Javascript
微信小程序多张图片上传功能
2017/06/07 Javascript
详解Angular4中路由Router类的跳转navigate
2017/06/09 Javascript
vue实现图片滚动的示例代码(类似走马灯效果)
2018/03/03 Javascript
layui 设置table 行的高度方法
2018/08/17 Javascript
适用于 Vue 的播放器组件Vue-Video-Player操作
2020/11/16 Javascript
在树莓派2或树莓派B+上安装Python和OpenCV的教程
2015/03/30 Python
实例讲解Python的函数闭包使用中应注意的问题
2016/06/20 Python
实现python版本的按任意键继续/退出
2016/09/26 Python
Python实现备份MySQL数据库的方法示例
2018/01/11 Python
python+opencv识别图片中的圆形
2020/03/25 Python
python使用pandas抽样训练数据中某个类别实例
2020/02/28 Python
如何使用PyCharm引入需要使用的包的方法
2020/09/22 Python
css3旋转木马_动力节点Java学院整理
2017/07/12 HTML / CSS
上海微创软件面试题
2012/06/14 面试题
上课迟到检讨书
2014/01/19 职场文书
《孔子游春》教学反思
2014/02/25 职场文书
cf战队收人广告词
2014/03/14 职场文书
拉拉队口号
2014/06/16 职场文书
明星邀请函
2015/02/02 职场文书
2015年小学师德师风建设工作总结
2015/10/23 职场文书
特别篇动画《总之就是非常可爱 ~制服~》PV公开,2022年夏季播出
2022/04/04 日漫
Nginx代理Redis哨兵主从配置的实现
2022/07/15 Servers
Redis实战之Lettuce的使用技巧详解
2022/12/24 Redis