成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

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

hedzr / 870人閱讀

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

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

類和原型

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

工廠方法

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

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

好啦,一個工廠實例完成,試用一下這個工廠,用來加工生產(chǎn)一批對象

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

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

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

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

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

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

來,嘗試一下這個函數(shù)

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

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

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

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

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

r.foreach(console.log)

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

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

// 一個構造函數(shù),用以初始化新創(chuàng)建的范圍對象
// 注意,這里并沒有新建并返回一個對象,僅僅是將該對象初始化
function Range(from, to) {
  // 這兩個屬性不在原型鏈中
  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 其中有一項約定,是一般情況下,類第一個字母大寫,函數(shù)第一個字母小寫,采用駝峰命名法,這個具有一定分辨

好吧,貌似這本書有點問題,估計是更新的原因,代碼始終不通過,這點過

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

書中和實際中的是,事實上js不會完成這一轉換,估計在新版本中去掉了,全部代碼如下

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

// 一個構造函數(shù),用以初始化新創(chuàng)建的范圍對象
// 注意,這里并沒有新建并返回一個對象,僅僅是將該對象初始化
var range = function Range(from, to) {
  // 這兩個屬性不在原型鏈中
  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 + ")"; },
};

另外需要在總結一點,prototype和__proto__之間的關系,前者是加到該屬性中,在繼承時為繼承的原型鏈,后者是繼承的繼承的,即父的父的關系的繼承,一個是往上有一層,一個是兩層,鏈如下


如果使用__proto__則如下

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

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

如上圖所示,其中根據(jù)new創(chuàng)建的對象的原型鏈是根據(jù)new的操作數(shù)來進行的。
b.constructor();
undefined
 所以這樣是能訪問其new的函數(shù)的

ps含義constructor為構造器,真的貼近啊,實際上就是構造器,貌似有一本書是js的設計模式

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

構造函數(shù)和類標識

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

當原型鏈修改的時候,其子不會發(fā)生改變

通過運算符instanceof來進行計算

b instanceof a;
false
constructor屬性

對就是上文中的構造器。
依舊這一段代碼

var range = function Range(from, to) {
  // 這兩個屬性不在原型鏈中
  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,因為沒有返回值,必須使用new,讓其成為對象,而操作數(shù)為其原型



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

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

轉載請注明本文地址:http://m.hztianpu.com/yun/96205.html

相關文章

  • JavaScript || 類和模塊

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

    CoorChice 評論0 收藏0
  • ECMA_OOP

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

    yacheng 評論0 收藏0

發(fā)表評論

0條評論

hedzr

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<