日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

js中的类、继承、闭包

發布時間:2023/12/20 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 js中的类、继承、闭包 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、js中的類

  類:在面向對象編程中,類(class)是對象(object)的模板,定義了同一組對象(又稱"實例")共有的屬性和方法。

? ? ? ? ? Javascript是一種基于對象(object-based)的語言,你遇到的所有東西幾乎都是對象。但是,它又不是一種真正的面向對象編程(OOP)語言,因為它的語法中沒有class(類)。但是可以用一些變通的方法,模擬出"類"。

參考阮一峰老師的定義類的三種方法

Javascript定義類(class)的三種方法

一、構造函數法

  這是經典方法,也是教科書必教的方法。它用構造函數模擬"類",在其內部用this關鍵字指代實例對象。

  function Cat() {

    this.name = "大毛";

  }

? ? ? ?生成實例的時候,使用new關鍵字。

  var cat1 = new Cat();

  alert(cat1.name); // 大毛

? ? ? 類的屬性和方法,還可以定義在構造函數的prototype對象之上。

  Cat.prototype.makeSound = function(){

    alert("喵喵喵");

  }

  它用構造函數模擬"類",在其內部用this關鍵字指代實例對象。

  function Cat() {

    this.name = "大毛";

  }

  生成實例的時候,使用new關鍵字。

  var cat1 = new Cat();

  alert(cat1.name); // 大毛

二、Object.create()法

為了解決"構造函數法"的缺點,更方便地生成對象,Javascript的國際標準ECMAScript第五版(目前通行的是第三版),提出了一個新的方法Object.create()。

用這個方法,"類"就是一個對象,不是函數。

  var Cat = {

    name: "大毛",

    makeSound: function(){ alert("喵喵喵"); }

  };

然后,直接用Object.create()生成實例,不需要用到new。

  var cat1 = Object.create(Cat);

  alert(cat1.name); // 大毛

  cat1.makeSound(); // 喵喵喵

目前,各大瀏覽器的最新版本(包括IE9)都部署了這個方法。如果遇到老式瀏覽器,可以用下面的代碼自行部署。

  if (!Object.create) {

    Object.create = function (o) {

       function F() {}

      F.prototype = o;

      return new F();

    };

  }

這種方法比"構造函數法"簡單,但是不能實現私有屬性和私有方法,實例對象之間也不能共享數據,對"類"的模擬不夠全面。

三、極簡主義法

荷蘭程序員Gabor de Mooij提出了一種比Object.create()更好的新方法,他稱這種方法為"極簡主義法"(minimalist approach)。這也是我推薦的方法。

3.1 封裝

這種方法不使用this和prototype,代碼部署起來非常簡單,這大概也是它被叫做"極簡主義法"的原因。

首先,它也是用一個對象模擬"類"。在這個類里面,定義一個構造函數createNew(),用來生成實例。

  var Cat = {

    createNew: function(){

      // some code here

    }

  };

然后,在createNew()里面,定義一個實例對象,把這個實例對象作為返回值。

  var Cat = {

    createNew: function(){

      var cat = {};

      cat.name = "大毛";

      cat.makeSound = function(){ alert("喵喵喵"); };

      return cat;

    }

  };

使用的時候,調用createNew()方法,就可以得到實例對象。

  var cat1 = Cat.createNew();

  cat1.makeSound(); // 喵喵喵

這種方法的好處是,容易理解,結構清晰優雅,符合傳統的"面向對象編程"的構造,因此可以方便地部署下面的特性。

3.2 繼承

讓一個類繼承另一個類,實現起來很方便。只要在前者的createNew()方法中,調用后者的createNew()方法即可。

先定義一個Animal類。

  var Animal = {

    createNew: function(){

      var animal = {};

      animal.sleep = function(){ alert("睡懶覺"); };

      return animal;

    }

  };

然后,在Cat的createNew()方法中,調用Animal的createNew()方法。

  var Cat = {

    createNew: function(){

      var cat = Animal.createNew();

      cat.name = "大毛";

      cat.makeSound = function(){ alert("喵喵喵"); };

      return cat;

    }

  };

這樣得到的Cat實例,就會同時繼承Cat類和Animal類。

  var cat1 = Cat.createNew();

  cat1.sleep(); // 睡懶覺

3.3 私有屬性和私有方法

在createNew()方法中,只要不是定義在cat對象上的方法和屬性,都是私有的。

  var Cat = {

    createNew: function(){

      var cat = {};

      var sound = "喵喵喵";

      cat.makeSound = function(){ alert(sound); };

      return cat;

    }

  };

上例的內部變量sound,外部無法讀取,只有通過cat的公有方法makeSound()來讀取。

  var cat1 = Cat.createNew();

  alert(cat1.sound);?// undefined

3.4 數據共享

有時候,我們需要所有實例對象,能夠讀寫同一項內部數據。這個時候,只要把這個內部數據,封裝在類對象的里面、createNew()方法的外面即可。

  var Cat = {

    sound : "喵喵喵",

    createNew: function(){

      var cat = {};

      cat.makeSound = function(){ alert(Cat.sound); };

      cat.changeSound = function(x){ Cat.sound = x; };

      return cat;

    }

  };

然后,生成兩個實例對象:

  var cat1 = Cat.createNew();

  var cat2 = Cat.createNew();

  cat1.makeSound(); // 喵喵喵

這時,如果有一個實例對象,修改了共享的數據,另一個實例對象也會受到影響。

  cat2.changeSound("啦啦啦");

  cat1.makeSound(); // 啦啦啦

js中的繼承

在 javaScript 中,每個對象都有一個指向它的原型(prototype)對象的內部鏈接。(使用構造函數法模擬類 函數仍是 對象)這個原型對象又有自己的原型,直到某個對象的原型為null 為止(也就是不再有原型指向),組成這條鏈的最后一環。這種一級一級的鏈結構就稱為原型鏈.

利用prototype來實現繼承

定義一個Person類

function Person(){this.sayHello = function(){ alert("helloworld"); } } Person.prototype.setName=function(name){ this.name = name; } Person.prototype.getName=function(){ return this.name; } var p = new Person(); p.sayHello(); p.setName("wang"); alert(p.getName());

現在我們定義一個Student類來繼續Person類:

function Student(){} Student.prototype = new Person(); var s = new Student(); s.sayHello(); s.setName("xi"); alert(s.getName());

這樣Student類即繼承了Person類。

使用javaScript的閉包來完成繼承:

1.什么是js的閉包

js閉包Demo:

function A(){ function B(){ alert("Hello Closure!"); } return B; } var b = A(); b();//Hello Closure!

這是史上最簡單的閉包,不能再簡單了,再簡單就不是閉包了!B為在函數內部定義的函數,用A函數返回,并用b來接收,也就是說在函數內部定義的函數,在外部使用,這種現象為閉包,所以繼承的封裝是閉包的一種應用。

2.閉包的作用

avascript中的GC機制:在javascript中,如果一個對象不再被引用,那么這個對象就會被GC回收,否則這個對象一直會保存在內存中。

在上述例子中,B定義在A中,因此B依賴于A,而外部變量b又引用了B, 所以A間接的被b引用,也就是說,A不會被GC回收,會一直保存在內存中。?
這就是閉包的作用,有時候我們需要一個模塊中定義這樣一個變量:希望這個變量一直保存在內存中但又不會“污染”全局的變量,這個時候,我們就可以用閉包來定義這個模塊。

轉載于:https://www.cnblogs.com/zhangxintong1314/p/6508788.html

總結

以上是生活随笔為你收集整理的js中的类、继承、闭包的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。