文档章节

JS的继承

L
 LorinLuo
发布于 2014/11/09 20:55
字数 521
阅读 15
收藏 0

原型:每个函数(构造器)都有一个prototype属性,prototype本身又是一个对象,prototype对象有一个constructor属性,constructor属性又是函数的函数指针,因此指向函数,因此函数和prototype之间相互引用。

原型链:

每个由构造器实例化的对象都有一个__proto__属性,该属性指向构造器的prototype属性,因此通过原型模拟了java中的类。

prototype对象也有一个__proto__属性,指向父类的prototype对象,下面的例子父类的prototype对象即为object prototype。

    function a(name, psd){
       this.name = name;
       this.psd = psd;
    }
    a.prototype = {
        qq: '123456'
    }
    var obj = new a('ly', '123');

    console.log(obj.name); //ly
    console.log(obj.psd);//123
    console.log(obj.qq);//123456

    obj的__proto__指向prototype对象,而a prototype对象的constructor属性又指向构造器a,a prototype对象的__proto__    属 性又指向Object对象的prototype对象即object prototype。

当我们访问一个实例对象的属性是,编译器寻找属性的顺序是:

1、找自身的属性  2、寻找对象原型的属性  3、寻找父类对象原型的属性 4、直到Object对象原型的属性 5、找不到,返回undefined

注意:每个实例化对象有自身私有的属性,也有公用属性即__proto__    

继承的方式:

1、构造继承法

    function a(name, psd){
        this.name = name;
        this.psd = psd;
    }
    function b(name, psd, qq){
        a.apply(this,arguments);

        //a.call(this, name, psd, qq)

          this.qq = qq;
    }
    a.prototype = {
        constructor: a,
        day: 1
    }
    var obj = new b('ly','123','123456');
    console.log(obj.name); //ly
onsole.log(obj.psd);//123
onsole.log(obj.qq);//123456
ole.log(obj.day);//undefined

2、原型继承法

通过复制已经存在的原型对象来实现行为重用,让实例对象共享原型对象的属性。这里是公有的。

    function a(name, psd){
        this.name = name;
        this.psd = psd;
    }
    a.prototype.qq = '123456';
    function b(){
    }
    b.prototype = new a('ly', '123');
    var obj = new b();
    console.log(obj.name); //ly
    console.log(obj.psd); //123
    console.log(obj.qq); //123456

3、拷贝继承法

    function a(){
        this.num=123;
        this.say=function(){
            alert("happy new year!");
        }
    }
    function b(){
        this.extends=function(obj){
            for(each in obj){
                this[each]=obj[each];
            }
        }
    }
    var oB=new b();
    oB.extends(new a());
    alert(oB instanceof a); // false
    alert(oB.num);          // 123
    oB.say();               // happy new year

4、临时变量法

    function a(){
        this.num=123;
    }
    function b(){
        this.temp = a;
        this.temp();
    }
    var obj = new b();
    console.log(obj.num)//123

 

© 著作权归作者所有

L
粉丝 18
博文 166
码字总数 116776
作品 0
成都
程序员
私信 提问
JavaScript继承(五)——寄生式继承

首先回顾一下原型式继承: 寄生式继承是与原型式继承紧密相关的一种思路,并且同样也是由克罗克福德推而广之的。 说到寄生式继承不得不说工厂模式和寄生构造函数模式创建对象。下面来回顾一下...

Bob2100
02/13
0
0
JavaScript instanceof 运算符深入剖析

随着 web 的发展,越来越多的产品功能都放在前端进行实现,增强用户体验。而前端开发的主要语言则是 JavaScript。学好 JavaScript 对开发前端应用已经越来越重要。在开发复杂产品中,需要使用...

IBMdW
2013/06/14
356
1
javascript原型的理解

JavaScript是一门面向对象的语言。在JavaScript中有一句很经典的话,万物皆对象。既然是面向对象的,那就有面向对象的三大特征:封装、继承、多态。这里讲的是JavaScript的继承,其他两个容后...

痴情小云
2018/06/26
0
0
简单理解JavaScript原型链

简单三连 什么是原型 ? 我是这样理解的:每一个JavaScript对象在创建的时候就会与之关联另外一个特殊的对象,这个对象就是我们常说的原型对象,每一个对象都会从原型“继承”属性和方法。 什么...

森林小猎人
05/07
0
0
JavaScript继承(四)——原型式继承

道格拉斯·克罗克福特在2006年提出了原型式继承,他的想法是基于已有的对象借助原型创建新对象,同时还不必因此创建一个自定义类型。为此,他给出了下面的函数: 在函数内部,先创建了一个临...

Bob2100
02/02
0
0

没有更多内容

加载失败,请刷新页面

加载更多

动态代理知识详解

动态代理实现的两种方式 给动态代理举个栗子:例如我们平时买笔记本电脑,很多时候都是不从厂家拿货,而是通过经销商买电脑。代理模式出现解决了生产厂家的一些问题,那么这个这个思想在我们...

我叫小糖主
14分钟前
2
0
Calendar TimeZone SimpleDateFormat

关于Calendar类的使用可参考:Java Calendar类的使用总结 获取日历(Calendar):java.util.Calendar#getInstance() 获取时区TimeZone: TimeZone.getTimeZone("GMT+00:00"); 或:TimeZone.ge......

Hzhodor
15分钟前
0
0
这 17 个 JVM 参数,高级 Java 必须掌握

前言 大家都知道,jvm在启动的时候,会执行默认的一些参数。一般情况下,这些设置的默认参数应对一些平常的项目也够用了。但是如果项目特别大了,需要增加一下堆内存的大小、或者是系统老是莫...

编程SHA
20分钟前
0
0
jenkins配置自动发送邮件

1.开通QQ的SMTP服务,需要发一条短信,qq会给你一个密码(不是你的QQ邮箱密码哦) 2.安装 Email Extension Plugin 插件 3.进入系统管理--系统设置 3.1按照如下图设置 首先找到 Extended E-m...

shzwork
25分钟前
0
0
网络请求异常拦截优化

目录介绍 01.网络请求异常分类 02.开发中注意问题 03.原始的处理方式 04.如何减少代码耦合性 05.异常统一处理步骤 06.完成版代码展示 好消息 博客笔记大汇总【16年3月到至今】,包括Java基础...

潇湘剑雨
29分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部