关于对象-原型

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();

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

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