對象&原型

OOP 指什么?有哪些特性

Object-oriented programming 面向對象編程;

  • OOP 是一種編程模式,這種模式將數(shù)據(jù)封裝成對象,采用操作對象的形式來編程;
    JS 是一種非常注重 OOP 的語言,它遵循 prototype 的方式,而不是傳統(tǒng) C 系語言的 class 模型

  • 特性

    • 類與對象:類的定義包含了數(shù)據(jù)的形式以及對數(shù)據(jù)的操作。對象是類的實例。
    • 封裝性:封裝是通過限制只有特定類的對象可以訪問這一特定類的成員,而它們通常利用接口實現(xiàn)消息的傳入傳出
    • 繼承性:,在某種情況下,一個類會有“子類”。子類比原本的類(稱為父類)要更加具體化,當一個類從多個父類繼承時,我們稱之為“多重繼承”
    • 多態(tài):多態(tài)(Polymorphism)是指由繼承而產(chǎn)生的相關的不同的類,其對象對同一消息會做出不同的響應
    • 抽象性:抽象(Abstraction)是簡化復雜的現(xiàn)實問題的途徑,它可以為具體問題找到最恰當?shù)念惗x,并且可以在最恰當?shù)睦^承級別解釋問題

維基百科
MDN

如何通過構造函數(shù)的方式創(chuàng)建一個擁有屬性和方法的對象?

function Person(name, age) {
  this.name = name
  this.age = age
  this.say = function(){
    console.log('Hello ' + this.name);
  }
}

var s = new Person('tom', '20')
s.say();

prototype 是什么?有什么特性

prototype(原型),每一個 JS 對象都有原型,原型是一個對象,所有的 JS 對象都從原型鏈里面繼承屬性和方法

  1. 字面量創(chuàng)建對象的原型鏈
var a = {
  a: 1
}
// 原型鏈 a ---> Object.prototype ---> null
var b = ['hello', 'world']
// 原型鏈 b ---> Array.prototype ---> Object.prototype ---> null

function fn() {
  return 2
}
// 原型鏈 fn ---> Function.prototype ---> Object.prototype ---> null
  1. 構造函數(shù)(constructor)創(chuàng)建對象的原型鏈
var Test = function() {
  this.name = 'Tuuu'
}

Test.prototype = {
  call: function(){
    console.log(this.name)
  }
}
var init = new Test()
init
// 原型鏈第一層指向'構造函數(shù).prototype'
// 原型鏈 init ---> Test.prototype(構造函數(shù).prototype) ---> Object.prototype ---> null
  1. Object.create ES5 的語法,可以快速創(chuàng)建原型鏈
var a = {
  a: 1
}
// 原型鏈 a ---> Object.prototype ---> null

var b = Object.create(a);
// 原型鏈 b ---> a ---> Object.prototype ---> null

var c = Object.create(b);
// 原型鏈 c ---> b ---> a ---> Object.prototype ---> null

var d = Object.create(null);
// 原型鏈 d ---> null

畫出如下代碼的原型圖

   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('饑人谷');
    var p2 = new People('前端');
p1 ---> People.prototype ---> Object.prototype ---> null
p1 ---> People.prototype ---> Object.prototype ---> null

創(chuàng)建一個 Car 對象,擁有屬性name、color、status;擁有方法runstop,getStatus

var Car = function(name, color, status){
  this.name = name
  this.color = color
  this.status = status
}

Car.prototype = {
  run: function(){
    console.log('Run')
  },
  stop: function(){
    console.log('Stop')
  },
  getStatus: function(){
    console.log(this.status)
  }
}

創(chuàng)建一個 GoTop 對象,當 new 一個 GotTop 對象則會在頁面上創(chuàng)建一個回到頂部的元素,點擊頁面滾動到頂部。擁有以下屬性和方法

```
1\. `ct`屬性,GoTop 對應的 DOM 元素的容器
2\.  `target`屬性, GoTop 對應的 DOM 元素
3\.  `bindEvent` 方法, 用于綁定事件
4 `createNode` 方法, 用于在容器內(nèi)創(chuàng)建節(jié)點
```
<!DOCTYPE html>
<html lang="zh-Hans">
<head>
  <meta charset="UTF-8">
  <title>面向對象編程</title>
  <style>
    .container {
      height: 1500px;
    }

    .goTop {
      font-size: 20px;
      position: fixed;
      right: 30px;
      bottom: 20px;
      cursor: pointer;
    }
    .hide {
      display: none;
    }
  </style>
</head>
<body>
  <div class="container">
    頂部
    <div class="goTop hide"></div>
  </div>
  <script src="http://apps.bdimg.com/libs/jquery/2.1.4/jquery.min.js"></script>
  <script>
    var GoTop = function(ct, target){
      this.ct = ct;
      this.target = target;
      this.bindEvent();
      this.createNode();
    }
    GoTop.prototype = {
      bindEvent: function(){
        var that = this;
        // 滾動事件
        $(window).scroll(function(){
          if ($(window).scrollTop() > window.innerHeight) {
            that.target.removeClass('hide');
          } else {
            that.target.addClass('hide');
          }
        })

        //點擊事件
        that.target.on('click', function(){
          $(window).scrollTop(0);
          console.log(1)
        })
      },

      // 創(chuàng)建節(jié)點
      createNode: function(){
        this.target.html('<span>回到頂部</span>');
      }

    }
    var gotop1 = new GoTop($('.container'), $('.goTop'));
  </script>
</body>
</html>

預覽地址

使用木桶布局實現(xiàn)一個圖片墻

Github預覽地址
Github代碼地址

?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容