关于对象-原型

1.OOP 指什么?有哪些特性

  • OOP:Object-oriented programming,缩写OOP,即面向对象程序设计,其中两个最重要的概念就是类和对象。类只是具备了某些功能和属性的抽象模型,而实际应用中需要一个一个实体,也就是需要对类进行实例化,类在实例化之后就是对象。

对象:将类实例化
实例化:就是将类实现的过程

  • 目的:
    1.改善可读性
    2.提高重用性

  • 原则:开放封闭原则
    1.开放:对模块进行扩展
    2.封闭:不必改动模块的源代码

  • 特性:三要素继承,封装,多态
    1.继承性:子类自动继承其父级类中的属性和方法,并可以添加新的属性和方法或者对部分属性和方法进行重写。继承增加了代码的可重用性。
    2.多态性:子类继承了来自父级类中的属性和方法,并对其中部分方法进行重写。
    3.封装性:将一个类的使用和实现分开,只保留部分接口和方法与外部联系。

2.如何通过构造函数的方式创建一个拥有属性和方法的对象?

var Animal = function(){
         this.name = '动物'
        
}//构造函数

Animal.prototype.say =function(){
         console.log(this.name+'叫')
}

var animal = new Animal()//实例化,得到一个对象
animal.say()
QQ截图20170412180915.jpg

3. prototype 是什么?有什么特性

function定义的对象有一个prototype属性,prototype属性又指向了一个prototype对象,注意prototype属性与prototype对象是两个不同的东西,要注意区别。在prototype对象中又有一个constructor属性,这个constructor属性同样指向一个constructor对象,而这个constructor对象恰恰就是这个function函数本身。

QQ截图20170412202346.jpg

这个prototype到底有什么作用呢?看下面的例子:

    function obj1(){}
    obj1.prototype.name = "zyn";
    var test = new obj1();
    console.log(test.name)// zyn 

奇怪吧,明明没有为test设置name属性,可是为什么会有值?
这就是prototype的功劳了,prototype属性中的name对象,在new构造函数之后,被继承到了对象test的属性中。接着看:


    var name = "js";
    function obj2(name){
       console.log(this.name);//css
    }
    obj2.prototype.name = "css";
    var test = new obj2();
     console.log(test.name)//css

第一步是建立一个新对象(test)。
第二步将该对象(test)内置的原型对象设置为构造函数prototype 属性引用的那个原型对象。
第三步就是将该对象(test)作为this 参数调用构造函数,完成成员设置等初始化工作。
其中第二步中出现了一个新名词就是内置的原型对象,注意这个新名词跟prototype对象不是一回事, 为了区别我叫它inobj,inobj就指向了函数的prototype对象。在prototype对象中出现的任何属性或者函数都可以在test对象中直接使用,这个就是JS中的原型继承了。

通常,这样创建一个对象:

 function person(name){
        this.name = name 
        this.sayHi = function(){
            console.log('Hi' +' '+ this.name)
        }
       
    }
     
     var z= new person('zyn')
     z.sayHi()//Hi zyn

以上,使用new关键字,通过对象(函数也是特殊对象)创建一个对象实例。

在基于类的语言中,属性或字段通常都是在类中事先定义好了,但在Javascript中,在创建对象之后还可以为类添加字段。

var Animal =function(){}
var cat = new Animal();
 cat.color = "green";

以上,color这个字段只属于当前的cat实例。

对于后加的字段,如果想让animal的所有实例都拥有呢?
使用prototype

       var Animal =function(){}
        Animal.prototype.color= "green";
        var cat = new Animal();
        var dog = new Animal();
        console.log(cat.color);//green
        console.log(dog.color);//green

通过Prototype不仅可以添加字段,还可以添加方法。

var Animal =function(){}
Animal.prototype.color= "green";
var cat = new Animal();
var dog = new Animal();
console.log(cat.color);//green
console.log(dog.color);//green
Animal.prototype.run= function(){
    console.log("run")
}
dog.run();

原来通过prototype属性,在创建对象之后还可以改变对象的行为。
比如,可以为数组这个特殊对象添加一个方法。

Array.prototype.remove = function(elem){//elem=2
      var index = this.indexOf(elem);//index=1
         if(index >= 0){
            this.splice(index, 1);
          }
}
var arr = [1, 2, 3] ;
arr.remove(2);
//原数组变为arr[1,3]

除了通过prototype为对象定义属性或方法,还可以通过对象的构造函数来定义类的属性或方法。

var Animal = function(){
    this.color = "green";
   this.run = function(){
    console.log("run");
     }
}
var mouse = new Animal();
  mouse.run();

以上做法的也可以让所有的Animal实例共享所有的字段和方法。并且还有一个好处是可以在构造函数中使用类的局部变量。

var Animal = function (){
       var runAlready = false;
       this.color = "green";
       this.run = function(){
            if(!runAlreadh){
        console.log("start running");
       } else {
          console.log("already running")
         }
    }

 }

其实,一个更加实际的做法是把通过构造函数结合通过prototype定义一个类的字段和行为。

ar Animal = function (){
       var runAlready = false;
       this.color = "green";
       this.run = function(){
            if(!runAlready){
        console.log("start running");
       } else {
          console.log("already running")
         }
    }

 }
Animal.prototype.color = '';
Animal.prototype.hide = function(){
       console.log("111");
}
var horse = new Animal();
horse.run(); //start running
horse.hide();//111

Prototype允许我们在创建对象之后来改变对象或类的行为,并且这些通过prototype属性添加的字段或方法所有对象实例是共享的。

4.画出如下代码的原型图

function People (name){
  this.name = name;
  this.sayName = function(){
    console.log('my name is:' + this.name);
  }
}

People.prototype.walk = function(){
  console.log(this.name + ' is walking');  
}

var p1 = new People('zyn');
var p2 = new People('JL');
QQ截图20170412220720.jpg

5. 创建一个 Car 对象,拥有属性name、color、status;拥有方法run,stop,getStatus

var Car = function(name,color,status){
    this.name =name;
    this.color =color;
    this.status = status;
   
}
    Car.prototype.run =function(){
        console.log('running')
    }
    
    Car.prototype.stop =function(){
        console.log('stop')
    }
    
    Car.prototype.getStatus =function(){
        console.log(this.status)
    }
var Ben = new Car ('Ben','black',120)
QQ截图20170412222108.jpg

6.创建一个 GoTop 对象,当 new 一个 GotTop 对象则会在页面上创建一个回到顶部的元素,点击页面滚动到顶部。

20170413_002555.gif
//主要代码


var GoTop = function(ct,target){
              this.ct = ct;
              this.target = $('<div class="goTop">回到顶部</div>')
              this.target.css({
                    position:'fixed',
                    right:'100px',
                    bottom:'50px',
                    display:'none',
                    padding:'8px',
                    cursor:'pointer',
                    border:'1px solid',
                    borderRadius:'4px'
                })

          }
          GoTop.prototype.creatNode = function(){
              this.ct.append(this.target);
          }

          GoTop.prototype.bindEvent = function(){
              var _this = this;
              var $window = $(window);
            
              $window.on('scroll',function(){
                var $top = $window.scrollTop()
                  if($top>100){
                      _this.target.css('display','block')
                  }else{
                      _this.target.css('display','none')
                  }
              })
              this.target.on('click',function(){
                _this.ct.animate({
                   scrollTop : 0
               })
              })
          }

          var Gotop =new GoTop($('body'))
          Gotop.creatNode();
          Gotop.bindEvent();

效果
希望对给位朋友有所帮助~~
版权归饥人谷--楠柒所有如有转发请注明出处 谢谢~~

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

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,600评论 18 139
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,587评论 18 399
  • 官方中文版原文链接 感谢社区中各位的大力支持,译者再次奉上一点点福利:阿里云产品券,享受所有官网优惠,并抽取幸运大...
    HetfieldJoe阅读 2,987评论 4 14
  • 近年微商做朋友圈里横起 , 朋友圈成立微商重地 , 但是没有几个人的朋友圈 整理干净的 说白了, 很少有人搞明白微...
    熊芳菲阅读 566评论 0 0
  • 1 据说聪明的人不会感觉自己聪明,只是觉得其他人反应有些慢。 帅的人也不会觉得自己有多帅,只是觉得其他人五官排序有...
    脱口岳阅读 381评论 0 0