溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

JS中有哪些創(chuàng)建類的方法

發(fā)布時(shí)間:2021-07-12 10:53:24 來源:億速云 閱讀:112 作者:小新 欄目:web開發(fā)

小編給大家分享一下JS中有哪些創(chuàng)建類的方法,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

具體如下:

Javascript是一種基于對(duì)象的語言,你遇到的所有東西幾乎都是對(duì)象。但是,它又不是一種真正的面向?qū)ο缶幊蹋∣OP)語言,因?yàn)樗恼Z法中沒有Class。(不過,ES6引入了Class這個(gè)概念,作為對(duì)象的模板。通過class關(guān)鍵字,可以定義類。ES6入門:http://es6.ruanyifeng.com/)。

但是在項(xiàng)目開發(fā)中,經(jīng)常用到JS面向?qū)ο箝_發(fā),這就需要我們?nèi)ビ肑S創(chuàng)建類,從而去實(shí)例化一些對(duì)象。接下來我們介紹一下在JS中創(chuàng)建類的幾種方式:

1.工廠方式:

//通過工廠方式創(chuàng)建對(duì)象,先定義一個(gè)工廠方法
function createObj(){
  var obj = new Object();
  obj.name="xxx";
  obj.say=function(){
    alert("我是xxx");
  }
  return obj;
}
//調(diào)用工廠方法創(chuàng)建對(duì)象:
var obj1 = createObj();
//也可以用這種形式
function createObj(){
  var obj = {}; //這樣生成對(duì)象
  obj.name="xxx";
  obj.say=function(){
    alert("我是xxx");
  }
  return obj;
}
var obj1 = createObj();

這種方式的問題是每一次通過工廠方法去創(chuàng)建一個(gè)對(duì)象,這個(gè)對(duì)象的屬性name和方法say都必須重新創(chuàng)建一次,浪費(fèi)內(nèi)存。

2.構(gòu)造器方式:

//創(chuàng)建一個(gè)構(gòu)造器,構(gòu)造函數(shù)首字母大寫
function Obj(){
  this.name="xxx";
  this.say=function(){
    alert("我是xxx");
  };
}
//利用構(gòu)造器,通過new關(guān)鍵字生成對(duì)象
var obj1=new Obj();

這是最基本的方式,但是也存在和工廠方式一樣的毛病。

3.原型方式:

//用空函數(shù)創(chuàng)建一個(gè)類
function Obj(){
}
//在類的原型鏈上添加屬性和方法
Obj.prototype.name="xxx";
Obj.prototype.say=function(){
  alert("我是xxx");
}
//生成對(duì)象
var obj1=new Obj();

這個(gè)方式的缺點(diǎn)是,當(dāng)有引用屬性時(shí),改變一個(gè)對(duì)象的這個(gè)屬性也會(huì)改變其他對(duì)象的這個(gè)屬性。因?yàn)橐粋€(gè)引用屬性,都是指向的同一個(gè)地方。

4.原型/構(gòu)造聯(lián)合方式

//用構(gòu)造函數(shù)定義對(duì)象的非函數(shù)屬性
function Obj(name){
  this.name=name;
  this.arr=new Array('a','b');
}
//用原型方式定義對(duì)象的方法
Obj.prototype.say=function(){
  alert("我是xxx");
}
//生成對(duì)象
var obj1 = new Obj('xxx');

這種是目前用的最多的創(chuàng)建類和對(duì)象的方式,將方法和屬性用不同的方式封裝。

5.動(dòng)態(tài)原型方式

//動(dòng)態(tài)原型方式和原型/構(gòu)造混合方式的原理相似,唯一的區(qū)別就是賦予對(duì)象方法的位置
function Person(name, sex) {
  this.name = name;
  this.sex = sex;
  if (typeof this.say != "function") {
    Person.prototype.say = function () {
      alert(this.name);
    }
  }
}
var man =new Person ("凱撒", "男");
man.say();//凱撒

動(dòng)態(tài)原型模式是將所有的信息都封裝到構(gòu)造函數(shù)中,構(gòu)造函數(shù)中,只用say不存在的情況下,才會(huì)將它添加到原型中。這段代碼只有在初次調(diào)用時(shí)才會(huì)執(zhí)行。

實(shí)例化obj對(duì)象有三步:

1. 創(chuàng)建obj對(duì)象:

obj=new Object();

2. 將obj的內(nèi)部__proto__指向構(gòu)造他的函數(shù)Obj的prototype,同時(shí),obj.constructor===Obj.prototype.constructor,從而使得obj.constructor.prototype指向Obj.prototype(obj.constructor.prototype===A.prototype)。obj.constructor.prototype與的內(nèi)部_proto_是兩碼事,實(shí)例化對(duì)象時(shí)用的是_proto_,obj是沒有prototype屬性的,但是有內(nèi)部的__proto__,通過__proto__來取得原型鏈上的原型屬性和原型方法。

3. 將obj作為this去調(diào)用構(gòu)造函數(shù)Obj,從而設(shè)置成員(即對(duì)象屬性和對(duì)象方法)并初始化。

當(dāng)這3步完成,這個(gè)obj對(duì)象就與構(gòu)造函數(shù)Obj再無聯(lián)系,這個(gè)時(shí)候即使構(gòu)造函數(shù)Obj再加任何成員,都不再影響已經(jīng)實(shí)例化的obj對(duì)象了。

以上是“JS中有哪些創(chuàng)建類的方法”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI