继承

问题

1.继承有什么作用?

  • 继承是指一个对象直接使用另一对象的属性和方法。
  • 作用:
    1.当js中的两个对象有很多的共性时,子对象的构造函数没必要重新实现父对象的共性,而可以采用继承的方式,继承父对象的属性和方法,这样子对象在拥有父对象的特性的同时,也可以对自己的特性进行扩充,实现了代码的复用,程序的优化,js中通过原型链来实现继承。
    2.用纯js做一些复杂的工具或框架系统就要用到了,比如webgis、或者js框架如jquery、ext等,继承可以减少代码量,有利于维护代码

2.有几种常见创建对象的方式? 举例说明?

  • 字面量形式:var obj={a:1,b:2}

  • 构造函数方式,先创建一个构造函数(有参数),通过new创建
    function people(name,age){
    this.name=name;
    this.age=age;
    this.sayName=function(){
    console.log('my name is',this.name)
    }
    }
    var p1=new people('mike',20)

  • 工厂模式 ,通过return得到不同的对象返回值,但是得不到对象的类型
    function createPeople(name,sex){
    var obj={
    name:name,
    sex:sex,
    sayName:function(){
    console.log('my name is',this.name)
    }
    }
    return obj
    }
    var p1=createPeople('nick','man')
    var p2=createPeople('mary','woman')

  • 原型方式 ,在构造函数内部定义对象的属性,在构造函数的原型对象中定义公共的方法,节省代码,优化内存

     function createPeople(name,sex){
     this.name=name;
     this.sex=sex;
     }
     createPeople.prototype.sayName=function(){
     console.log('my name is '+this.name)
     }
     var p1= new createPeople('nick','man')
     p1.sayName()
     var p2= new createPeople('mary','woman')
     p2.sayName()
    

3.下面两种写法有什么区别?

//方法1
function People(name, sex){
    this.name = name;
    this.sex = sex;
    this.printName = function(){
        console.log(this.name);
    }
}
var p1 = new People('饥人谷', 2)

//方法2
function Person(name, sex){
    this.name = name;
    this.sex = sex;
}

Person.prototype.printName = function(){
    console.log(this.name);
}
var p1 = new Person('若愚', 27);
  • 方法1,使用的是构造函数的模式,这种方法创建对象的属性和方法都是在构造函数的内部创建并执行,无法实现继承和扩展,每次创建都要重新执行函数,重复创造消耗空间和性能,
  • 方法2,使用的原型方式,将对象共有的方法printName在构造函数的原型中定义,这样每次创建对象时,printName方法不会重复创建,当创造对象时,直接调用原型对象中保存的方法,实现了继承,便于扩展,有利于代码简洁,性能的优化

4.Object.create有什么作用?兼容性如何?如何使用?

  • Object.create() 方法创建一个拥有指定原型和若干个指定属性的对象。

  • 兼容性:IE9+,Chrome5+,Firfox4.0+,Opera11.60+,Safari5+

  • 使用Object.create()来实现类式继承,语法:Object.create(*proto,* [ *propertiesObject* ]),将创建的原型对象赋值到新函数的原型,实现继承
    // 构造函数
    function people(name,sex){
    this.name=name;
    this.sex=sex;
    }
    people.prototype.printName=function(){
    console.log('my name is '+this.name)
    }
    function student(name,sex,grade){
    people.call(this,name,sex)
    this.grade=grade;
    }
    //Object.create来使student继承people的方法
    function inherit(parent,child){
    var _prototype=Object.create(parent.prototype)
    _prototype.constructor=child;
    child.prototype=_prototype;
    }
    inherit(people,student)

    student.prototype.study=function(){
      console.log(this.name+'是'+this.grade+'学生')
    }
    var p1=new student('nick','man','三年级');
    p1.printName();
    p1.study();
    

5.hasOwnProperty有什么作用? 如何使用?

  • hasOwnProperty()方法用来判断某个对象是否含有指定的自身属性。

  • 所有继承了 Object.prototype的对象都会从原型链上继承到 hasOwnProperty 方法,这个方法可以用来检测一个对象是否含有特定的自身属性,和 运算符不同,该方法会忽略掉那些从原型链上继承到的属性。

  • 使用 hasOwnProperty方法判断某对象是否含有特定的自身属性
    var obj={};
    obj.name="nick";
    function test() {
    obj.newName=obj.name;
    delete obj.name;
    }

    obj.hasOwnProperty('name');//true
    test();
    obj.hasOwnProperty('name');//false
    obj.hasOwnProperty('newName');//true
    
  • hasOwnProperty 方法对待自身属性和继承属性的区别
    var obj=new Object();
    obj.name="mike";//自身属性
    obj.hasOwnProperty('name')//true
    obj.hasOwnProperty('toString')//false,继承Object的属性
    obj.hasOwnProperty('hasOwnProperty')//false,继承Object的属性

  • 如果一个对象拥有自己的 hasOwnProperty方法, 则原型链上的同名方法会被遮蔽(shadowed)
    var foo={
    hasOwnProperty:function () {
    return false
    },
    name:'nick'
    }
    foo.hasOwnProperty('name')//false,因为一直调用了obj的hasownProperty
    //解决方法,直接使用原型链的真正的hasOwnProperty
    ({}).hasOwnProperty.call(foo, 'bar'); //true,请在控制台直接操作,不然会报错
    Object.prototype.hasOwnProperty.call(foo,'name')//true

  • 遍历一个对象的所有自身属性
    var buz = {
    fog: 'stack'
    };

          for (var name in buz) {
              if (buz.hasOwnProperty(name)) {
                  alert("this is fog (" + name + ") for sure. Value: " + buz[name]);
              }
              else {
                  alert(name); // toString or something else
              }
          }
    

6.实现Object.create的 polyfill

  • 一个shim是一个库,它将一个新的API引入到一个旧的环境中,而且仅靠旧环境中已有的手段实现
  • 一个polyfill就是一个用在浏览器API上的shim.我们通常的做法是先检查当前浏览器是否支持某个API,如果不支持的话就加载对应的polyfill.然后新旧浏览器就都可以使用这个API了
    function create(obj){
    function temp(){};
    var newObj=(function(obj){
    if(typeof obj!='object'){
    throw TypeError('Object prototype may only be an Object or null')
    }
    temp.prototype=obj;
    var prot=new temp();
    temp.prototype=null;
    return prot
    })(obj)
    return newObj;
    }
    var obj={a:1,b:2}
    var obj2=create(obj)
    console.log(obj2.a)

7.如下代码中call的作用是什么?

      function Person(name, sex){
        this.name = name;
        this.sex = sex;
    }
    function Male(name, sex, age){
        Person.call(this, name, sex);    //这里的 call 有什么作用
        this.age = age;
    }
  • call方法执行一个函数,传入执行期上下文和函数的参数,把this的作用域指向了person,在Male函数下执行person(name,sex),因此也继承了person的name和sex属性

8.补全代码,实现继承

    function Person(name, sex){
        this.name=name;
        this.sex=sex;
    }

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

    function Male(name, sex, age){
       Person.call(this,name,sex)
       this.age=age
    }

    var _prototype=Object.create(Person.prototype);
    _prototype.constructor=Male;
    Male.prototype=_prototype;

    Male.prototype.printName=function(){
        console.log('name is '+this.name)
    }
    
    Male.prototype.getAge = function(){
        return this.age
    };

    var ruoyu = new Male('若愚', '男', 27);
    ruoyu.printName();//name is 若愚

代码题

实现如下dialog 弹窗功能, 参考效果

代码预览
效果预览 由于作业上传上去GitHub上有,班级预览项目没有?使用了jsbin预览

  • 小结:发现鼠标的拖拽效果不写data缓存数据也能实现。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,544评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,430评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,764评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,193评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,216评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,182评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,063评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,917评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,329评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,543评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,722评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,425评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,019评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,671评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,825评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,729评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,614评论 2 353

推荐阅读更多精彩内容

  • 继承有什么作用? (难度:3*) 继承可以使一个对象直接使用另一个对象的属性和方法。 有几种常见创建对象的方式? ...
    coolheadedY阅读 524评论 0 0
  • 1. apply、call 、bind有什么作用,什么区别? call ,apply的作用:调用一个函数,传入函数...
    Rising_suns阅读 395评论 0 0
  • 问答 继承有什么作用?继承可以将另一个function上的prototype拷贝过来,当想做多个属性的面包的时候会...
    StarLikeRain阅读 274评论 0 0
  • 作业 this 相关问题 问题1: apply、call 有什么作用,什么区别apply()和call()函数都可...
    饥人谷_桶饭阅读 389评论 0 0
  • apply、call 、bind有什么作用,什么区别 apply:fn.apply( obj,])将fn函数里的t...
    邵志远阅读 493评论 0 0