题目一:

//有关于原型继承的代码如下:
function Person(name) {
   this.name = name;
}
Person.prototype = {
     getName : function() {
    return this.name;
    }
}
function Student(name, id) {
     Person.call(this, name)
    this.id = id;
}

//接下来的一行,我们提供了有三种写法:
//第一种:Student.prototype = Person.prototype;
//第二种:Student.prototype = new Person();
//第三种:Student.prototype = Object.create(Person.prototype);
         Student.prototype.getId = function() {
             return this.id;
         }
//请问:
//1.请简述代码中注释处的三种写法的每一种,是否正确,是否完美.如果都不够完美,那你应该如何写.
//2.除了注释处,代码的其他部分还有值得优化的地方么.

 
My Answer:
1.这三种写法,写法一是错误的,写法二三是正确的。
  对于写法一,只是把Person的原型对象赋值给了Student的原型对象,这样子虽然Student的实例中可以访问到Person的原型上的属性和方法,但是对于不是绑定在原型上的属性,例如Person中的this.name,实例中是不会有这个属性的。所以这并不是继承。只是简单的引用,因为Person.prototype是一个对象,也是引用类型,这样的赋值只是把Person.prototype的引用赋值给了Student.prototype。既然是引用,那两者如果有一方发生改动,另一方必然会受影响。这样new出来的实例之间也是互相影响的。
 对于写法二,确实是正确的写法,这种写法就是组合继承,但是不是完美的写法。因为创建实例的过程中两次调用了父类的构造函数。
 对于写法三,也是正确的写法,这种写法就是寄生式继承。但是不是完美的写法。首先,ES3中没有Object.create()方法,没有做兼容。然后,这种继承如果父类中含有引用类型,如数组,那么继承之后,各个实例中的这个引用类型会互相影响。
相对更完美的写法:
function inheritPrototype(SubType,SuperType){
   var prototype;
   if(typeof Object.create==='function'){
       prototype=Object.create(SuperType.prototype);
   }else{
       funciont W(){};
       W.prototype=SuperType.prototype;
       prototype=new W();
   }
       prototype.constructor=SubType;       Student.prototype=prototype;
}inheritPrototype(Student,Person);

题目二,感觉给出了写法就是可以用来回答题目二的了。不过,还要优化的话,我想应该是这里

Person.prototype = {
     getName : function() {
    return this.name;
    }
}

这里重新定义了原型对象,覆盖了原来的constructor属性,可以把它定义回去。就是这样

Person.prototype = {
     constructor:Person,
     getName : function() {
    return this.name;
    }
}

  

  

JS继承类相关试题的更多相关文章

  1. JS 继承(类式 与 原型式)

    1. /* -- 类式继承 -- *///先声明一个超类 function Person(name) { this.name = name;}//给这个超类的原型对象上添加方法 getName Per ...

  2. js继承---类继承法

    //父类 function Aaa(name,sex,inter){ this.name = name; this.sex = sex; this.inter = [1,2,3]; } Aaa.pro ...

  3. 关于原生JS获取类相关的代码

    <script> var FungetElementsByClassName = function(str,root,tag){ if(root){ root = typeof root ...

  4. Python学习笔记008_类_对象_继承_组合_类相关的BIF

    # 对象 = 属性 + 方法>>> # Python中的类名约定以大写字母开始>>> # tt = Turtle() 这就是创建类实例的方法,其它语言用new ,它 ...

  5. js继承的常用方法

    写在前面的话:这篇博客不适合对面向对象一无所知的人,如果你连_proto_.prototype...都不是很了解的话,建议还是先去了解一下JavaScript面向对象的基础知识,毕竟胖子不是一口吃成的 ...

  6. js继承

    js继承有5种实现方式: 继承第一种方式:对象冒充 function Parent(username){ this.username = username; this.hello = function ...

  7. C#异常类相关总结

    C#异常类相关总结 C#异常类相关总结 C#异常类一.基类ExceptionC#异常类二.常见的异常类1.SystemException类:该类是System命名空间中所有其他异常类的基类.(建议:公 ...

  8. js继承的概念

    js里常用的如下两种继承方式: 原型链继承(对象间的继承) 类式继承(构造函数间的继承) 由于js不像java那样是真正面向对象的语言,js是基于对象的,它没有类的概念.所以,要想实现继承,可以用js ...

  9. js继承之call,apply和prototype随谈

    在js中,call,apply和prototype都可以实现对象的继承,下面我们看一个例子: function FatherObj1() { this.sayhello = "I am jo ...

随机推荐

  1. 聊聊css hack

    什么是CSS hack CSS hack由于不同厂商的浏览器,比如Internet Explorer,Safari,Mozilla Firefox,Chrome等,或者是同一厂商的浏览器的不同版本,如 ...

  2. SQLServer中的死锁的介绍

    简介      什么是死锁? 我认为,死锁是由于两个对象在拥有一份资源的情况下申请另一份资源,而另一份资源恰好又是这两对象正持有的,导致两对象无法完成操作,且所持资源无法释放. 什么又是阻塞? 阻塞是 ...

  3. iBATIS.net获取运行时sql语句

    [本文原创,第一次离首页如此之近.发在候选区攒攒rp,管理员看着不合适可以撤下.] 虽然只在iBatis的世界里小打小闹匆匆数月,却历经数次与领导和同事激辩,再通过不懈努力学习和开发积累,楼猪终于被它 ...

  4. 在Windows8 Winrt中 高性能处理多个条件语句 用于实现自定义手势

    http://blog.csdn.net/wangrenzhu2011/article/details/8578806 (转) 在winrt中 多点触控 控件的应用越来越多,例如 各种手势与 控件之间 ...

  5. Oracle DBLINK 抽数以及DDL、DML操作

    DB :  11.2.0.3.0 原库实例orcl:SQL> select instance_name from v$instance; INSTANCE_NAME--------------- ...

  6. 【转】Android底层库和程序

    原文网址:http://blog.csdn.net/louiswangbing/article/details/6616202 Android底层库和程序 1.     本地实现的基本结构 Andro ...

  7. 安装ejabberd2并配置MySQL为其数据库

    以前用过openfire做为服务器,但是openfire的集群支持不是很好,所以改用Ejabberd,由于它是用Erlang语言开发的,其并发率与分布式的功能都是很强悍的,在此我记录一下我的安装与配置 ...

  8. UVA_393_Doors_(计算几何基础+最短路)

    描述 https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=5&page ...

  9. linux 多线程基础4

    六.线程的作用域 函数pthread_attr_setscope和pthread_attr_getscope分别用来设置和得到线程的作用域,这两个函数的定义如下: 7. 名称:: pthread_at ...

  10. Memcached应用总结

    Memcached应用总结 memcached是一款高性能的分布式缓存系统,凭借其简单方便的操作,稳定可靠的性能广泛应用于互联网应用中,网上关于memcached介绍的资料也很多,最经典的资料就是&l ...