摘要:目錄導(dǎo)語(yǔ)理解對(duì)象和面向?qū)ο蟮某绦蛟O(shè)計(jì)創(chuàng)建對(duì)象的方式的繼承機(jī)制原型對(duì)象原型鏈與原型對(duì)象相關(guān)的方法小結(jié)導(dǎo)語(yǔ)前面的系列文章,基本把的核心知識(shí)點(diǎn)的基本語(yǔ)法標(biāo)準(zhǔn)庫(kù)等章節(jié)講解完本章開始進(jìn)入核心知識(shí)點(diǎn)的高級(jí)部分面向?qū)ο蟮某绦蛟O(shè)計(jì),這一部分的內(nèi)容將會(huì)對(duì)對(duì)象
目錄 導(dǎo)語(yǔ) 1.理解對(duì)象和面向?qū)ο蟮某绦蛟O(shè)計(jì) 2.創(chuàng)建對(duì)象的方式 3.JavaScript的繼承機(jī)制
前面的系列文章,基本把JavaScript的核心知識(shí)點(diǎn)的基本語(yǔ)法、標(biāo)準(zhǔn)庫(kù)等章節(jié)講解完;
本章開始進(jìn)入JavaScript核心知識(shí)點(diǎn)的高級(jí)部分——面向?qū)ο蟮某绦蛟O(shè)計(jì),這一部分的內(nèi)容將會(huì)對(duì)對(duì)象這一數(shù)據(jù)類型做進(jìn)一步的深化理解,并且講述幾種創(chuàng)建對(duì)象的設(shè)計(jì)模式以及JavaScript獨(dú)特的繼承機(jī)制;
"面向?qū)ο缶幊?(Object Oriented Programming,縮寫為OOP)本身是一種編程的思維模式,它把世界的一切看作是對(duì)象的集合,世界的運(yùn)轉(zhuǎn)就是靠一個(gè)個(gè)對(duì)象分工、合作的結(jié)果,體現(xiàn)一切皆“對(duì)象”思想;
而在程序設(shè)計(jì)當(dāng)中,面向?qū)ο缶幊叹涂梢钥醋鼍帉懜鱾€(gè)具有特定功能的對(duì)象(模塊)并將它們進(jìn)行有機(jī)的分工合作,即目前的模塊化編程就是面向?qū)ο蟮某绦蛟O(shè)計(jì)的實(shí)際應(yīng)用;
對(duì)象在前面的系列文章中曾經(jīng)提到,從數(shù)據(jù)特征上看,對(duì)象是無(wú)序?qū)傩裕ㄦI值對(duì))的集合;
我們可以使用字面量和構(gòu)造函數(shù)的方式去創(chuàng)建一個(gè)最為簡(jiǎn)單的對(duì)象:
var person = new Object(); person.name = "teren"; person.age = 18; person.greet = function(){ console.log("hello "+this.name); } var teren = { name:"teren", age:18, greet:function(){ console.log("hello "+this.name); } }
通常創(chuàng)建一個(gè)簡(jiǎn)單的對(duì)象,都是采用字面量的方式;
上面的對(duì)象就是對(duì)現(xiàn)實(shí)對(duì)象的一種抽象表達(dá);
前面章節(jié)中我們使用delete命令可以刪除一些對(duì)象的屬性,有一些又不可以,使用Object.keys()方法只能遍歷可枚舉屬性,那么對(duì)象的屬性是否有一些特性是我們尚未了解的呢?
ES5提供了一種只有內(nèi)部才用的特性(attribute)去描述對(duì)象的屬性(property)的各種特性,使用[[attribute]]表示,在JavaScript中不能直接訪問(wèn)它們;
一個(gè)我們非常熟悉的栗子就是Number構(gòu)造函數(shù)構(gòu)造出來(lái)的實(shí)例對(duì)象;
我們無(wú)法直接訪問(wèn)num.[[PrimitiveValue]],這一屬性,只能通過(guò)num.valueOf()訪問(wèn)該值;
ES5中定義對(duì)象屬性的兩種特性,數(shù)據(jù)特性和訪問(wèn)器特性,對(duì)象屬性可以兼?zhèn)溥@兩種特性;
數(shù)據(jù)特性定義對(duì)象的屬性值的特性,一個(gè)屬性值可以包括以下四個(gè)數(shù)據(jù)特性:
[[Value]]:存放屬性值; [[Writable]]:是否可寫屬性; [[Enumerable]]:是否為可枚舉屬性; [[Configurable]]:是否可用delete命令刪除;
訪問(wèn)器特性定義對(duì)象的屬性在訪問(wèn)屬性和設(shè)置屬性時(shí)調(diào)用的兩個(gè)函數(shù)getter和setter;
[[Get]]:訪問(wèn)屬性時(shí)調(diào)用的函數(shù); [[Set]]:設(shè)置屬性時(shí)調(diào)用的函數(shù);
下面以一個(gè)實(shí)例對(duì)象直接講解這兩個(gè)特性:
//數(shù)據(jù)特性; var teren = {}; Object.defineProperty(teren,{ value:"teren", writable:false, enumerable:true, configurable:true }) //訪問(wèn)器特性; //html //js var obj = Object.defineProperty({},"name",{ set:function(name){ document.getElementById("name").innerHTML=name }, get:function(){ console.log( document.getElementById("name").innerHTML ) }, }) obj.name = "hello world" obj.name
【demo】
Object.defineProperties可以一次性配置對(duì)象的多個(gè)屬性;
上一節(jié)我們對(duì)面向?qū)ο蟮某绦蛟O(shè)計(jì)思想和對(duì)象有了初步理解,這一節(jié)我們深入探討一下對(duì)象的創(chuàng)建方式及其優(yōu)缺點(diǎn);
創(chuàng)建對(duì)象的不同方式也可以簡(jiǎn)單的稱作設(shè)計(jì)模式,不同的設(shè)計(jì)模式在實(shí)際編程應(yīng)用中起到不同的作用;
單例模式就是產(chǎn)生一個(gè)類的唯一實(shí)例對(duì)象,它能夠確保您只有一個(gè)對(duì)象實(shí)例能夠?qū)嶋H派上用場(chǎng);
單例模式下,創(chuàng)建對(duì)象方式如下:
var singleton = { attr:1, method:function(){ return this.attr } } var ex1 = singleton; var ex2 = singleton; ex1 === ex2//true
上述創(chuàng)建單例的方式:
優(yōu)點(diǎn):使用非常簡(jiǎn)捷;
缺點(diǎn):缺乏封裝,成員暴露,初始化時(shí)占用資源;
可以使用閉包方式解決這一問(wèn)題:
var substance = (function(){ var unique; function init(){ var type; return { setType:function(t){ return type = t; } } } return { getInstance:function(){ if(!unique){ unique = init(); } return unique; } } })(); var Adam = substance.getInstance(); var Eve = substance.getInstance(); Adam === Eve Adam.setType("Man")//Man
單例模式只能創(chuàng)作單個(gè)實(shí)例對(duì)象,也就是說(shuō)如果將該實(shí)例對(duì)象賦予多個(gè)變量時(shí),會(huì)存在對(duì)象的引用問(wèn)題,即修改其中一個(gè)變量會(huì)影響到另一個(gè)變量;
有時(shí)我們需要?jiǎng)?chuàng)造多個(gè)結(jié)構(gòu)相似的對(duì)象,只有部分屬性有所區(qū)別,這時(shí)候工廠模式派上用場(chǎng);
工廠模式的設(shè)計(jì)思想就是能夠像工廠一樣批量生產(chǎn)出相似屬性和方法的對(duì)象,使用工廠模式能解決多個(gè)相似的問(wèn)題,例如創(chuàng)造多個(gè)彈窗(只是標(biāo)題不同);
function person(name,age){ var obj = new Object(); obj.name = name; obj.age = age; obj.greet = function(){ return "hello "+this.name; }; return obj } var Adam = person("Adam",18); var Eve = person("Eve",20);
上述工廠模式:
優(yōu)點(diǎn):能批量生產(chǎn)結(jié)構(gòu)類似的對(duì)象;封裝創(chuàng)建對(duì)象的細(xì)節(jié);
缺點(diǎn):未能解決對(duì)象的類型,即由哪個(gè)構(gòu)造函數(shù)創(chuàng)建的;
構(gòu)造函數(shù)可以創(chuàng)建特定類型的對(duì)象,類似之前的Array、RegExp等原生對(duì)象都能創(chuàng)造特定類型的實(shí)例對(duì)象;
function Person(name,age){ this.name = name; this.age = age; this.greet = function(){ return "hello "+this.name; } } var p1 = new Person("Adam",18); var p2 = new Person("Eve",20);
使用構(gòu)造函數(shù)模式就能夠解決實(shí)例對(duì)象由誰(shuí)創(chuàng)建的問(wèn)題;
上述代碼和工廠模式的區(qū)別在于:
1.沒(méi)有顯示創(chuàng)建新對(duì)象;
2.直接將屬性和方法賦給this對(duì)象;
3.沒(méi)有return語(yǔ)句;
4.函數(shù)名開頭大寫以區(qū)別普通函數(shù);
5.使用new操作符去創(chuàng)建對(duì)象實(shí)例;
new操作符的原理
使用new操作符去調(diào)用函數(shù)和直接調(diào)用函數(shù)不同,其new操作符的運(yùn)行函數(shù)的過(guò)程為:
創(chuàng)建一個(gè)新對(duì)象;
將構(gòu)造函數(shù)的作用域賦給新對(duì)象并執(zhí)行構(gòu)造函
內(nèi)的代碼;
返回新對(duì)象;
使用代碼表示如下:
function Person(name,age){ this.name = name; this.age = age; this.greet = function(){ return "hello "+this.name; } } function createPerson(name,age){ var o = new Object(); Person.call(o,name,age); return o; } var p1 = createPerson("Adam",18); var p2 = createPerson("Eve",20);
使用構(gòu)造函數(shù)模式創(chuàng)建對(duì)象的優(yōu)缺點(diǎn)在于:
優(yōu)點(diǎn):能夠識(shí)別對(duì)象屬于的構(gòu)造函數(shù);
缺點(diǎn):如果存在不同實(shí)例對(duì)象共享的屬性和方法,使用構(gòu)造函數(shù)模式則會(huì)浪費(fèi)內(nèi)存;
【注】
關(guān)于this關(guān)鍵字的更多知識(shí)點(diǎn)可以參見【what"s this】;
構(gòu)造函數(shù)如果不用new操作符調(diào)用和普通函數(shù)是一樣的;
每個(gè)函數(shù)都有一個(gè)prototype原型屬性,這個(gè)原型屬性可以部署特定類型的實(shí)例共享的屬性和方法;
function Person(){} Person.prototype.greet = function(){ return "hello "+this.name; }
將原來(lái)的greet函數(shù)部署在Person函數(shù)的prototype原型屬性上,這樣p1和p2可以共享該方法,而不像構(gòu)造函數(shù)模式每創(chuàng)建一個(gè)實(shí)例就增加一個(gè)greet方法浪費(fèi)內(nèi)存;
【注】
關(guān)于原型對(duì)象的更多理解詳見下一節(jié)——JavaScript的繼承機(jī)制;
使用原型模式創(chuàng)建對(duì)象的優(yōu)缺點(diǎn)在于:
優(yōu)點(diǎn):對(duì)于每個(gè)實(shí)例的共享屬性和方法能夠較好實(shí)現(xiàn);
缺點(diǎn):多帶帶采用原型模式將無(wú)法區(qū)分不同實(shí)例的私有屬性;
混合模式,就是綜合構(gòu)造函數(shù)模式和原型模式的優(yōu)缺點(diǎn),構(gòu)造函數(shù)模式部署實(shí)例的私有屬性,原型模式部署實(shí)例的公有屬性;
function Person(name,age){ this.name = name; this.age = age; } Person.prototype.greet = function(){ return "hello "+this.name; } var p1 = new Person("Adam",18); var p2 = new Person("Eve",20);
混合模式是目前使用最廣泛、認(rèn)同度最高的一種創(chuàng)建自定義類型(類)的設(shè)計(jì)模式;
【注】
當(dāng)然,設(shè)計(jì)模式不僅僅上述所提到,還有更加精深可以參考《設(shè)計(jì)模式》一書以及之前小羊?qū)懙囊黄恼隆对O(shè)計(jì)模式梗概》;
上一節(jié)我們通過(guò)創(chuàng)建對(duì)象的不同模式,隱式引出了原型對(duì)象的概念,這一節(jié)中我們將詳細(xì)了解一下原型對(duì)象、原型鏈及其實(shí)現(xiàn)的繼承機(jī)制;
前面,我們從數(shù)據(jù)特征上看,知道對(duì)象是無(wú)序?qū)傩裕ㄦI值對(duì))的集合;
現(xiàn)在,我們可以從面向?qū)ο蟮慕嵌瓤?,任何?duì)象都是更為抽象的對(duì)象的實(shí)例,可以理解為類的概念;
從這個(gè)角度理解,我們現(xiàn)在可以重新定義一下對(duì)象和類的含義:
對(duì)象可以說(shuō)是對(duì)現(xiàn)實(shí)事物的抽象,對(duì)象封裝了屬性和方法,屬性值指的是對(duì)象的狀態(tài),方法指的是對(duì)象的行為;
類是提供一種模板的‘對(duì)象’,它是對(duì)象的抽象;
舉個(gè)簡(jiǎn)單的栗子:
function Person(name,age){ this.name = name; this.age = age; } Person.prototype.greet = function(){ return "hello "+this.name; } var p1 = new Person("Adam",18); var p2 = new Person("Eve",20);
上述代碼表明,p1和p2兩個(gè)實(shí)例是對(duì)現(xiàn)實(shí)Adam和Eve的抽象,而“類”Person又是對(duì)2個(gè)實(shí)例的抽象,為創(chuàng)建相似結(jié)構(gòu)的人提供標(biāo)準(zhǔn)的模板;
[注]ES6之前JavaScript中沒(méi)有類,在ES6中定義了類;
在上一節(jié)的原型模式中,我們提到每個(gè)函數(shù)都有一個(gè)prototype屬性,這個(gè)屬性指向函數(shù)的原型對(duì)象,可以部署特定類型的實(shí)例共享的屬性和方法;
更為深入理解prototype原型對(duì)象,prototype原型對(duì)象不僅可以部署特定類型的實(shí)例共享的屬性和方法,而且還是實(shí)現(xiàn)JavaScript繼承的關(guān)鍵;
只要?jiǎng)?chuàng)建一個(gè)新函數(shù)就會(huì)為該函數(shù)創(chuàng)建一個(gè)prototype屬性,每個(gè)prototype屬性自動(dòng)獲得一個(gè)constructor屬性,該屬性指向prototype屬性所在的函數(shù)指針;
當(dāng)使用構(gòu)造函數(shù)創(chuàng)建一個(gè)實(shí)例時(shí),該實(shí)例內(nèi)部包含一個(gè)內(nèi)部屬性__proto__指向構(gòu)造函數(shù)的原型對(duì)象;
由此,一個(gè)簡(jiǎn)單的繼承便產(chǎn)生了;
以下面代碼為例:
function Person(name,age){ this.name = name; this.age = age; } Person.prototype.greet = function(){ return "hello "+this.name; } var p1 = new Person("Adam",18); var p2 = new Person("Eve",20);
構(gòu)造函數(shù)創(chuàng)建之后,自動(dòng)創(chuàng)建一個(gè)prototype屬性,prototype原型對(duì)象下有一個(gè)默認(rèn)的constructor屬性指向prototype屬性所在的函數(shù)Person中;
在prototype原型對(duì)象上部署greet方法,實(shí)例p1的內(nèi)部屬性__proto__指向構(gòu)造函數(shù)Person.prototype,由此繼承了構(gòu)造函數(shù)的原型對(duì)象上的greet方法;
【注意】
實(shí)例的__proto__指向構(gòu)造函數(shù)的prototype原型對(duì)象實(shí)現(xiàn)繼承,這種聯(lián)系存在于實(shí)例與構(gòu)造函數(shù)的原型對(duì)象之間而不是構(gòu)造函數(shù)之間;
當(dāng)js引擎解析對(duì)象的屬性時(shí),先會(huì)搜索對(duì)象本身的屬性,如果沒(méi)有則會(huì)去搜索__proto__指向的原型對(duì)象上的屬性,直到找到為止,如果在對(duì)象本身定義的屬性和原型對(duì)象上的具有相同屬性名,則在讀取該屬性時(shí),自身屬性會(huì)屏蔽原型對(duì)象上的屬性;
function Person(name,age){ this.name = name; this.age = age; } Person.prototype.greet = function(){ return "hello "+this.name; } var p1 = new Person("Adam",18); p1.greet()//hello Adam; p1.greet = function(){ return "hello world" }
修改構(gòu)造函數(shù)的原型對(duì)象可以直接使用點(diǎn)操作,效果是直接在原來(lái)的原型對(duì)象上增加屬性,有時(shí)需要增加的屬性太多是,點(diǎn)操作就顯得太麻煩,可以采用重置原型對(duì)象的方法:
function Person(name,age){ this.name = name; this.age = age; } Person.prototype = { constructor:Person, greet1:function(){}, greet2:function(){}, greet3:function(){} }; var p1 = new Person("Adam",18); Person.prototype.constructor.name//"Object"
需要注意的是,重置原型對(duì)象后,要重新為原型對(duì)象的constructor的屬性指回Person構(gòu)造函數(shù);
如果不重置constructor的話,那么此時(shí)的Person.prototype是由字面量創(chuàng)建的對(duì)象,字面量創(chuàng)建的對(duì)象默認(rèn)的構(gòu)造函數(shù)是Object;
上面我們只定義一個(gè)構(gòu)造函數(shù),實(shí)現(xiàn)一次繼承;如果存在多個(gè)構(gòu)造函數(shù),它們之間也存在繼承關(guān)系,那么就會(huì)形成一條關(guān)于繼承的原型鏈;
function SuperType(name,age){ this.name = name; this.age = age } SuperType.prototype.greet = function(){ return "hello "+this.name } function SubType(name,age,height){ SuperType.call(this,name,age); this.height = height; } SubType.prototype = Object.create(SuperType.prototype); SubType.prototype.constructor = SubType; SubType.prototype.method = function(){return 1;} var instance = new SubType("teren",18,180)
上面就是一個(gè)最為常用的實(shí)現(xiàn)多個(gè)類間繼承的設(shè)計(jì)模式;
使用Object.create(SuperType.prototype)的優(yōu)缺點(diǎn)在于:
優(yōu)點(diǎn):能夠創(chuàng)建一個(gè)新的SuperType.prototype對(duì)象賦給SubType.prototype,修改SubType.prototype這個(gè)而不影響原來(lái)構(gòu)造函數(shù)SuperType.prototype;
缺點(diǎn):雖然擁有子類的prototype和父類的prototype值是相同的,但內(nèi)存不同,從而切斷子類和父類之間的類型;
還可以使用SubType.prototype =new SuperType()實(shí)現(xiàn)相同效果,其優(yōu)缺點(diǎn)在于:
優(yōu)點(diǎn):能夠體現(xiàn)子類和父類的繼承關(guān)系;
缺點(diǎn):子類具有父類的私有屬性;
所以,一般在實(shí)際實(shí)現(xiàn)原型鏈時(shí)使用Object.create()方法,而理解原型鏈時(shí)使用new SuperType()方法;
遍歷對(duì)象屬性方法
Object.keys()和Object.getOwnPropertyNames()用于遍歷對(duì)象自身而不是繼承的屬性名,返回一個(gè)數(shù)組,其中Object.keys()只返回可枚舉屬性;
in用于檢查一個(gè)對(duì)象是否具有某個(gè)屬性。它不區(qū)分該屬性是對(duì)象自身的屬性,還是繼承的屬性;
for...in用于遍歷對(duì)象的所有可枚舉屬性(不管是自身的還是繼承的)
如果只遍歷自身的屬性,可以使用如下代碼:
for (var key in instance){ if(instance.hasOwnProperty(key)){ console.log(key) } }
判斷屬性是否為自身的方法
Object.prototype.hasOwnProperty()返回一個(gè)布爾值,用于判斷某個(gè)屬性定義在對(duì)象自身,還是定義在原型鏈上;
設(shè)置和獲取實(shí)例對(duì)象的原型對(duì)象的方法
Object.getPropertyOf()返回一個(gè)實(shí)例對(duì)象的原型對(duì)象;
Object.setPropertyOf(obj,prototype)可傳兩個(gè)參數(shù),第1個(gè)為現(xiàn)有參數(shù),第2個(gè)為原型對(duì)象;
判斷一個(gè)對(duì)象是否為另一個(gè)對(duì)象的原型對(duì)象
Object.prototype.isPrototypeOf()用于判斷一個(gè)對(duì)象是否是另一個(gè)對(duì)象的原型;
通讀本文,我們可以知道:
面向?qū)ο缶幊虝r(shí)一種思維模式,它把世界的一切看做是對(duì)象的集合,世界的運(yùn)作是一個(gè)個(gè)對(duì)象分工合作的結(jié)果;映射到程序設(shè)計(jì)中,就是編寫各個(gè)具有特定功能的對(duì)象(模塊),并將它們有機(jī)整合使程序得以運(yùn)作;
對(duì)象從數(shù)據(jù)特征角度看,是無(wú)序鍵值對(duì)的集合,對(duì)象的屬性具有兩種特性——數(shù)據(jù)特性和訪問(wèn)器特性;
創(chuàng)建對(duì)象的不同方式可以稱為設(shè)計(jì)模式,本文簡(jiǎn)單講解了單例模式、工廠模式、構(gòu)造函數(shù)模式、原型模式、混合模式等;
從面向?qū)ο蠼嵌瓤?,?duì)象可以說(shuō)是對(duì)現(xiàn)實(shí)事物的抽象,類是對(duì)對(duì)象的抽象;
每個(gè)函數(shù)都有一個(gè)原型對(duì)象prototype,既可以部署特定類型實(shí)例的共享屬性和方法,也是JavaScript實(shí)現(xiàn)繼承的關(guān)鍵;
prototype原型對(duì)象有一個(gè)constructor屬性,該屬性指向prototype所在的函數(shù)指針;
每當(dāng)使用構(gòu)造函數(shù)創(chuàng)建一個(gè)實(shí)例時(shí),該實(shí)例內(nèi)部包含一個(gè)內(nèi)部屬性__proto__指向構(gòu)造函數(shù)的原型對(duì)象,由此實(shí)現(xiàn)簡(jiǎn)單的繼承;
當(dāng)A構(gòu)造函數(shù)是B構(gòu)造函數(shù)的實(shí)例時(shí),由此就會(huì)形成一條原型鏈,即
A構(gòu)造函數(shù)的實(shí)例對(duì)象C的__proto__指向A構(gòu)造函數(shù)的原型對(duì)象prototype,A構(gòu)造函數(shù)prototype的__proto__指向B構(gòu)造函數(shù)的原型對(duì)象prototype,B構(gòu)造函數(shù)prototype的__proto__指向Function構(gòu)造函數(shù)的prototype,F(xiàn)unction的prototype的__proto__指向Object的prototype;
與原型對(duì)象的相關(guān)方法包括:Object.keys()和Object.getPropertyNames()、for...in方法,Object.getPrototypeOf()和Object.setPrototypeOf()方法,Object.prototype.hasOwnProperty()和Object.prototype.isPrototypeOf()方法;
參考資料《JavaScript高級(jí)程序設(shè)計(jì)(第3版)》
《JavaScript標(biāo)準(zhǔn)參考教程》——阮一峰
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/81094.html
摘要:很多情況下,通常一個(gè)人類,即創(chuàng)建了一個(gè)具體的對(duì)象。對(duì)象就是數(shù)據(jù),對(duì)象本身不包含方法。類是相似對(duì)象的描述,稱為類的定義,是該類對(duì)象的藍(lán)圖或原型。在中,對(duì)象通過(guò)對(duì)類的實(shí)體化形成的對(duì)象。一類的對(duì)象抽取出來(lái)。注意中,對(duì)象一定是通過(guò)類的實(shí)例化來(lái)的。 showImg(https://segmentfault.com/img/bVTJ3H?w=900&h=385); 馬上就要到七夕了,離年底老媽老爸...
摘要:很多情況下,通常一個(gè)人類,即創(chuàng)建了一個(gè)具體的對(duì)象。對(duì)象就是數(shù)據(jù),對(duì)象本身不包含方法。類是相似對(duì)象的描述,稱為類的定義,是該類對(duì)象的藍(lán)圖或原型。在中,對(duì)象通過(guò)對(duì)類的實(shí)體化形成的對(duì)象。一類的對(duì)象抽取出來(lái)。注意中,對(duì)象一定是通過(guò)類的實(shí)例化來(lái)的。 showImg(https://segmentfault.com/img/bVTJ3H?w=900&h=385); 馬上就要到七夕了,離年底老媽老爸...
摘要:很多情況下,通常一個(gè)人類,即創(chuàng)建了一個(gè)具體的對(duì)象。對(duì)象就是數(shù)據(jù),對(duì)象本身不包含方法。類是相似對(duì)象的描述,稱為類的定義,是該類對(duì)象的藍(lán)圖或原型。在中,對(duì)象通過(guò)對(duì)類的實(shí)體化形成的對(duì)象。一類的對(duì)象抽取出來(lái)。注意中,對(duì)象一定是通過(guò)類的實(shí)例化來(lái)的。 showImg(https://segmentfault.com/img/bVTJ3H?w=900&h=385); 馬上就要到七夕了,離年底老媽老爸...
摘要:是完全的面向?qū)ο笳Z(yǔ)言,它們通過(guò)類的形式組織函數(shù)和變量,使之不能脫離對(duì)象存在。而在基于原型的面向?qū)ο蠓绞街?,?duì)象則是依靠構(gòu)造器利用原型構(gòu)造出來(lái)的。 JavaScript 函數(shù)式腳本語(yǔ)言特性以及其看似隨意的編寫風(fēng)格,導(dǎo)致長(zhǎng)期以來(lái)人們對(duì)這一門語(yǔ)言的誤解,即認(rèn)為 JavaScript 不是一門面向?qū)ο蟮恼Z(yǔ)言,或者只是部分具備一些面向?qū)ο蟮奶卣?。本文將回歸面向?qū)ο蟊疽?,從?duì)語(yǔ)言感悟的角度闡述為什...
摘要:用代碼可以這樣描述安全到達(dá)國(guó)外面向過(guò)程既然說(shuō)了面向?qū)ο?,那么與之對(duì)應(yīng)的就是面向過(guò)程。小結(jié)在這篇文章中,介紹了什么是面向?qū)ο蠛兔嫦蜻^(guò)程,以及中對(duì)象的含義。 這是 javascript 面向?qū)ο蟀鎵K的第一篇文章,主要講解對(duì)面向?qū)ο笏枷氲囊粋€(gè)理解。先說(shuō)說(shuō)什么是對(duì)象,其實(shí)這個(gè)還真的不好說(shuō)。我們可以把自己當(dāng)成一個(gè)對(duì)象,或者過(guò)年的時(shí)候相親,找對(duì)象,那么你未來(lái)的老婆也是一個(gè)對(duì)象。我們就要一些屬性,比...
摘要:對(duì)象重新認(rèn)識(shí)面向?qū)ο竺嫦驅(qū)ο髲脑O(shè)計(jì)模式上看,對(duì)象是計(jì)算機(jī)抽象現(xiàn)實(shí)世界的一種方式。除了字面式聲明方式之外,允許通過(guò)構(gòu)造器創(chuàng)建對(duì)象。每個(gè)構(gòu)造器實(shí)際上是一個(gè)函數(shù)對(duì)象該函數(shù)對(duì)象含有一個(gè)屬性用于實(shí)現(xiàn)基于原型的繼承和共享屬性。 title: JS對(duì)象(1)重新認(rèn)識(shí)面向?qū)ο? date: 2016-10-05 tags: JavaScript 0x00 面向?qū)ο?從設(shè)計(jì)模式上看,對(duì)象是...
閱讀 2091·2021-10-09 09:41
閱讀 1672·2021-09-28 09:36
閱讀 1187·2021-09-26 09:55
閱讀 1367·2021-09-10 11:17
閱讀 1225·2021-09-02 09:56
閱讀 2830·2019-08-30 12:58
閱讀 2990·2019-08-29 13:03
閱讀 1918·2019-08-26 13:40