亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

類和模塊 類和原型 工廠方法 構(gòu)造函數(shù) constructor

hedzr / 869人閱讀

摘要:即兩個(gè)構(gòu)造函數(shù)創(chuàng)建的實(shí)例的是指向同一個(gè)原型對(duì)象當(dāng)原型鏈修改的時(shí)候,其子不會(huì)發(fā)生改變通過(guò)運(yùn)算符來(lái)進(jìn)行計(jì)算屬性對(duì)就是上文中的構(gòu)造器。

類和模塊
每個(gè)js的對(duì)象都是屬性的集合。相互之間沒(méi)有聯(lián)系。
js也能定義對(duì)象的類,讓每個(gè)對(duì)象都共享某些屬性。
類的成員或者實(shí)例包含一些屬性,用來(lái)存放或者定義他們的狀態(tài)。有些屬性定義了其行為,(行為或者稱為方法)
方法是類定義的,被所有的實(shí)例共享。
例如,用一個(gè)類來(lái)表示復(fù)數(shù),同時(shí)定義了一些相關(guān)的復(fù)數(shù)運(yùn)算,一個(gè)這個(gè)類的實(shí)例應(yīng)當(dāng)包含這個(gè)實(shí)例的狀態(tài),即包含復(fù)數(shù)的實(shí)部和虛部,同樣還需要有行為,即方法,行為為復(fù)數(shù)的加減法運(yùn)算
js中類的實(shí)現(xiàn)是基于原型繼承機(jī)制的,如果兩個(gè)實(shí)例都從同一個(gè)原型對(duì)象上繼承了屬性,
如果兩個(gè)對(duì)象繼承自同一原型,往往意味著由同一個(gè)構(gòu)造函數(shù)創(chuàng)建并初始化。
js中的類和Java中的類不一樣?。。。?br>好吧,徹底看不懂書(shū)了。。心累
那就大概搜索一下博客得了
https://www.cnblogs.com/TomXu...
發(fā)現(xiàn)一個(gè)博客,先看看,再說(shuō),看樣子寫的很好,還出書(shū)了。
貌似寫的很好

類和原型

js中類的所有實(shí)例對(duì)象都從同一個(gè)原型對(duì)象上繼承屬性
額。暫時(shí)到這,剩下的實(shí)在看不懂了。。
┑( ̄Д  ̄)┍
感覺(jué)好難。。。
真的很難

工廠方法

工廠是函數(shù),產(chǎn)品是對(duì)象,通過(guò)制定其相關(guān)要求,批量產(chǎn)生對(duì)象,這樣的函數(shù)為工廠方法
一個(gè)工廠方法的實(shí)例

// 一個(gè)工廠實(shí)例
function range(from, to) {
  // 使用Object.create創(chuàng)建一個(gè)新的基于該函數(shù)原型鏈的一個(gè)對(duì)象
  var r = Object.create(range);
  
  // 存儲(chǔ)著起始和結(jié)束位置
  r.from = from;
  r.to = to;
  
  // 返回這個(gè)對(duì)象
  return r;
}

好啦,一個(gè)工廠實(shí)例完成,試用一下這個(gè)工廠,用來(lái)加工生產(chǎn)一批對(duì)象

var f1 = range(324, 345);
undefined
f1;
Object { from: 324, to: 345 }

這樣就灰常完美的創(chuàng)建的一個(gè)新的對(duì)象,并且這個(gè)對(duì)象是從324到345的
以上這個(gè)工廠能批量生產(chǎn)對(duì)象,只要制定其范圍,就能批量完成
灰常方便

Math.ceil 天花板函數(shù)
一個(gè)完整的工廠方法
// 一個(gè)工廠實(shí)例
function range(from, to) {
  // 使用Object.create創(chuàng)建一個(gè)新的基于該函數(shù)原型鏈的一個(gè)對(duì)象
  var r = Object.create(range.methods);
  
  // 存儲(chǔ)著起始和結(jié)束位置
  r.from = from;
  r.to = to;
  
  // 返回這個(gè)對(duì)象
  return r;
}

range.methods = {
  // 如果在這個(gè)范圍之內(nèi)則返回true,否false
  // 這個(gè)方法用于比較數(shù)字
  includes: function(x) {
    return this.from <= x && x <= this.to;
  },
  
  // 對(duì)于范圍內(nèi)的每個(gè)整數(shù)調(diào)用一次f
  // 這個(gè)方法用做輸出數(shù)字范圍
  foreach: function(f) {
    for(var x = Math.ceil(this.from); x <= this.to; x++) f(x);   
  },

  // 返回表示這個(gè)范圍的字符串
  toString: function() {
    return "(" + this.from + "..." + this.to + ")";
  },
}

上方代碼中,是基于range.methods方法為原型鏈進(jìn)行創(chuàng)建的,所有創(chuàng)建的對(duì)象都基于這個(gè)原型,并都繼承這個(gè)原型鏈

來(lái),嘗試一下這個(gè)函數(shù)

先創(chuàng)建一個(gè)變量,用于指向這個(gè)對(duì)象

var r = range(23,5464);
undefined
r;
Object { from: 23, to: 5464 }

然后~繼續(xù)
繼續(xù)使用其方法

r.includes;
function includes()
r.includes(2);
false

然后~繼續(xù)
繼續(xù)嘗試第二個(gè)屬性

r.foreach(console.log)

好吧(∩_∩)
瀏覽器崩潰了
o(≧口≦)o
輸出太多了
js的性能太不好,經(jīng)常崩潰,,無(wú)語(yǔ)
O__O "…

類和構(gòu)造函數(shù)
// range.js 表示類的另外一種實(shí)現(xiàn)

// 一個(gè)構(gòu)造函數(shù),用以初始化新創(chuàng)建的范圍對(duì)象
// 注意,這里并沒(méi)有新建并返回一個(gè)對(duì)象,僅僅是將該對(duì)象初始化
function Range(from, to) {
  // 這兩個(gè)屬性不在原型鏈中
  this.from = from;
  this.to = to;
}

// 添加Range類的原型鏈
Range.prototype = {
  includes: function(x) { return this.from <= x && x <= this.to; },
  
  foreach: function (f) { 
    for ( var x = Math.ceil(this.from); x <= this.to; x++ ) f(x);
  },
  
  "toString": function() { return "(" + this.from + this.to + ")"; }, 
};

好啦,這樣就再次的完成了。
接著執(zhí)行一下下

var r = Range(34, 45);
undefined
range = Range;
function Range()
var r = range(32, 43);
undefined
r;
undefined
ps 其中有一項(xiàng)約定,是一般情況下,類第一個(gè)字母大寫,函數(shù)第一個(gè)字母小寫,采用駝峰命名法,這個(gè)具有一定分辨

好吧,貌似這本書(shū)有點(diǎn)問(wèn)題,估計(jì)是更新的原因,代碼始終不通過(guò),這點(diǎn)過(guò)

var r = new range(23,34);
undefined
r;
{…}
?
from: 23
?
to: 34
?
: Object { includes: includes()
, foreach: foreach(), toString: toString()
 }
r.includes(33);
true

書(shū)中和實(shí)際中的是,事實(shí)上js不會(huì)完成這一轉(zhuǎn)換,估計(jì)在新版本中去掉了,全部代碼如下

// range.js 表示類的另外一種實(shí)現(xiàn)

// 一個(gè)構(gòu)造函數(shù),用以初始化新創(chuàng)建的范圍對(duì)象
// 注意,這里并沒(méi)有新建并返回一個(gè)對(duì)象,僅僅是將該對(duì)象初始化
var range = function Range(from, to) {
  // 這兩個(gè)屬性不在原型鏈中
  this.from = from;
  this.to = to;
}

// 添加Range類的原型鏈
range.prototype = {
  includes: function(x) { return this.from <= x && x <= this.to; },
  
  foreach: function (f) { 
    for ( var x = Math.ceil(this.from); x <= this.to; x++ ) f(x);
  },
  
  toString: function() { return "(" + this.from + this.to + ")"; },
};

另外需要在總結(jié)一點(diǎn),prototype和__proto__之間的關(guān)系,前者是加到該屬性中,在繼承時(shí)為繼承的原型鏈,后者是繼承的繼承的,即父的父的關(guān)系的繼承,一個(gè)是往上有一層,一個(gè)是兩層,鏈如下


如果使用__proto__則如下

這兩個(gè)有區(qū)別,不能會(huì)混為一談,一個(gè)是往子添加原型,一個(gè)是往父添加原型。
試用基本木有問(wèn)題,過(guò)

new的含義,new是創(chuàng)建一個(gè)空對(duì)象,并將其根據(jù)的對(duì)象的原型添加進(jìn)入這個(gè)空對(duì)象的原型

如上圖所示,其中根據(jù)new創(chuàng)建的對(duì)象的原型鏈?zhǔn)歉鶕?jù)new的操作數(shù)來(lái)進(jìn)行的。
b.constructor();
undefined
 所以這樣是能訪問(wèn)其new的函數(shù)的

ps含義constructor為構(gòu)造器,真的貼近啊,實(shí)際上就是構(gòu)造器,貌似有一本書(shū)是js的設(shè)計(jì)模式

前提條件是必須是對(duì)象,或者函數(shù),或者數(shù)組

構(gòu)造函數(shù)和類標(biāo)識(shí)

當(dāng)且僅當(dāng)兩個(gè)對(duì)象繼承自同一原型對(duì)象的時(shí)候,這個(gè)兩個(gè)才屬于一個(gè)類的實(shí)例。
即兩個(gè)構(gòu)造函數(shù)創(chuàng)建的實(shí)例的prototype是指向同一個(gè)原型對(duì)象

當(dāng)原型鏈修改的時(shí)候,其子不會(huì)發(fā)生改變

通過(guò)運(yùn)算符instanceof來(lái)進(jìn)行計(jì)算

b instanceof a;
false
constructor屬性

對(duì)就是上文中的構(gòu)造器。
依舊這一段代碼

var range = function Range(from, to) {
  // 這兩個(gè)屬性不在原型鏈中
  this.from = from;
  this.to = to;
}

// 添加Range類的原型鏈
range.prototype = {
  includes: function(x) { return this.from <= x && x <= this.to; },
  
  foreach: function (f) { 
    for ( var x = Math.ceil(this.from); x <= this.to; x++ ) f(x);
  },
  
  toString: function() { return "(" + this.from + this.to + ")"; },
};

其中必須使用new,因?yàn)闆](méi)有返回值,必須使用new,讓其成為對(duì)象,而操作數(shù)為其原型



明天是js的Java式繼承
https://www.iming.info/archiv...

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/96205.html

相關(guān)文章

  • JavaScript || 類和模塊

    摘要:屬性每個(gè)函數(shù)默認(rèn)有屬性方法返回的函數(shù)除外,其值為構(gòu)造函數(shù)創(chuàng)建對(duì)象繼承的對(duì)象。其思路使用原型鏈實(shí)現(xiàn)原型屬性和方法的繼承通過(guò)借用構(gòu)造函數(shù)實(shí)現(xiàn)實(shí)例屬性繼承。 1 類和模塊 每個(gè)獨(dú)立的JavaScript對(duì)象都是一個(gè)屬性的集合,獨(dú)立對(duì)象間沒(méi)有任何關(guān)系 ES5中的類是基于原型繼承實(shí)現(xiàn)的:如果兩個(gè)對(duì)象從同一個(gè)原型對(duì)象繼承屬性,稱兩個(gè)對(duì)象為同一個(gè)類的實(shí)例。r instanceof Range.pr...

    CoorChice 評(píng)論0 收藏0
  • ECMA_OOP

    摘要:效果不同事物之間的屬性即使屬性名相同,相互也不會(huì)發(fā)生沖突。命名空間的特點(diǎn)相互獨(dú)立,而不沖突。而函數(shù)執(zhí)行后的返回值,就是當(dāng)前類的實(shí)例在構(gòu)造函數(shù)當(dāng)中,類中函數(shù)中出現(xiàn)的指代當(dāng)前類的一個(gè)實(shí)例,不同實(shí)例之間的方法和屬性是不同的。 對(duì)象 對(duì)象數(shù)據(jù)類型的作用:把描述同一個(gè)事物(同一個(gè)對(duì)象)的屬性和方法放在同一個(gè)內(nèi)存空間下,起到了分組的作用。 效果:不同事物之間的屬性即使屬性名相同,相互也不會(huì)發(fā)生沖突...

    yacheng 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

hedzr

|高級(jí)講師

TA的文章

閱讀更多
最新活動(dòng)
閱讀需要支付1元查看
<