摘要:盡管的右操作數(shù)是構(gòu)造函數(shù),但計(jì)算過(guò)程實(shí)際是檢測(cè)了對(duì)象的繼承關(guān)系。通過(guò)創(chuàng)建的對(duì)象使用構(gòu)造函數(shù)的屬性作為它們的原型。
JavaScript之對(duì)象屬性 Object.create()繼承
ECMAScript 5定義了一個(gè)名為Object.create()的方法,它創(chuàng)建一個(gè)新對(duì)象, 其中第一個(gè)參數(shù)是這個(gè)對(duì)象的原型。Object.create()提供第二個(gè)可選參數(shù),用以對(duì)對(duì)象的屬性進(jìn)行進(jìn)一步描述。
Object.create()是一個(gè)靜態(tài)函數(shù),而不是提供給某個(gè)對(duì)象調(diào)用的方法。使用它的方法很簡(jiǎn)單,只須傳入所需的原型對(duì)象即可:
var o1 = object.create({x:1, y:2}); // o1繼承了屬性x和yinherit()函數(shù)繼承
通過(guò)原型繼承創(chuàng)建一個(gè)新對(duì)象
// inherit() 返回了一個(gè)繼承自原型對(duì)象p的屬性的新對(duì)象 //這里使用ECMAScript 5中的0bject. create()函數(shù)(如果存在的話(huà)) //如果不存在0bject . create(),則退化使用其他方法 function inherit(p) { if (p == nul1) throw TypeError(); // p是一個(gè)對(duì)象,但不能是null if (Object.create) // 如果bject. create()存在 return object.create(p); // 直接使用它 var t = typeof p; // 否則進(jìn)行進(jìn)- -步檢測(cè) if (t !== "object" & t !== "function") throw TypeError(); function f() {}; // 定義一個(gè)空構(gòu)造函數(shù) f.prototype = p; // 將其原型屬性設(shè)置為p return new f(); // 使用f()創(chuàng)建p的繼承對(duì)象 }對(duì)象繼承后屬性的創(chuàng)建、訪問(wèn)和修改 原型鏈:
假設(shè)要查詢(xún)對(duì)象o的屬性x,如果o中不存在x,那么將會(huì)繼續(xù)在o的原型對(duì)象中查詢(xún)屬性x。如果原型對(duì)象中也沒(méi)有x,但這個(gè)原型對(duì)象也有原型,那么繼續(xù)在這個(gè)原型對(duì)象的原型上執(zhí)行查詢(xún),直到找到x或者查找到一個(gè)原型是nul1的對(duì)象為止。可以看到,對(duì)象的原型屬性構(gòu)成了一個(gè)“鏈”,通過(guò)這個(gè)“鏈”可以實(shí)現(xiàn)屬性的繼承。
實(shí)例
var o = {}; o.x = 1; var p = inherit(o); p.y = 2; var q = inherit(p); q.y = 3; var s = q.toString(); q.x + q.y // =>3繼承對(duì)象的屬性賦值:
假設(shè)給對(duì)象o的屬性x賦值:
屬性賦值首先會(huì)檢查o中是否已有x屬性;
如果o中已有x屬性,則需先判定x屬性是o繼承的屬性還是自有屬性,從而進(jìn)一步判定屬性x是否為只讀屬性,如果o的原型鏈中存在該屬性但不允許修改則會(huì)導(dǎo)致屬性賦值失敗;
如果o中已有屬性x,但這個(gè)屬性不是繼承來(lái)的,那么這個(gè)賦值操作只是簡(jiǎn)單改變o的這個(gè)已有屬性x的值,賦值成功。
如果o中已有屬性x,但這個(gè)屬性是繼承而來(lái)的,屬性x允許賦值操作,那么這個(gè)賦值操作只改變這個(gè)o的屬性x的值,而不會(huì)去修改原型鏈,賦值成功。
如果o中不存在屬性x(原型鏈中也沒(méi)有已定義的屬性x),那么賦值操作會(huì)直接為o創(chuàng)建一個(gè)新的屬性x,賦值成功。
總結(jié):屬性賦值要么失敗,要么創(chuàng)建一個(gè)屬性,要么在原始對(duì)象中設(shè)置屬性,不會(huì)影響到原型鏈。但有一個(gè)例外,如果o繼承自屬性x,而這個(gè)屬性是一個(gè)具有setter方法的accessor屬性。
屬性訪問(wèn)錯(cuò)誤屬性訪問(wèn)并不總是返回或設(shè)置一個(gè)值。查詢(xún)一個(gè)不存在的屬性并不會(huì)報(bào)錯(cuò),如果在對(duì)象o自身的屬性或繼承的屬性中均未找到屬性x,屬性訪問(wèn)表達(dá)式o.x返回undefined。
這里假設(shè)book對(duì)象有屬性"sub-title",而沒(méi)有屬性"subtitle"
book.subtitle; // => undefined: 屬性不存在
但是,如果對(duì)象不存在,那么試圖查詢(xún)這個(gè)不存在的對(duì)象的屬性就會(huì)報(bào)錯(cuò)。null和undefined值都沒(méi)有屬性,因此查詢(xún)這些值的屬性會(huì)報(bào)錯(cuò),接上例:
//拋出一個(gè)類(lèi)型錯(cuò)誤異常,undefined沒(méi)有l(wèi)ength屬性 var len = book.subtitle.length;
除非確定book和book.subtitle都是(或在行為上)對(duì)象,否則不能這樣寫(xiě)表達(dá)式book.subtitle.length,因?yàn)檫@樣會(huì)報(bào)錯(cuò),下面提供了兩種避免出錯(cuò)的方法:
方法一
//一種冗余但很易懂的方法 var len = undefined; if (book) { if (book. subtitle) len = book.subtitle.length; }
方法二
//一種更簡(jiǎn)練的常用方法,獲取subtitle的length屬性或undefined var len = book && book.subtitle && book.subtitle.length;
這里利用了&&操作符的短路特點(diǎn)。
刪除屬性delete運(yùn)算符可以刪除對(duì)象的屬性。它的操作數(shù)應(yīng)當(dāng)是一個(gè)屬性訪問(wèn)表達(dá)式。讓人感到意外的是,delete 只是斷開(kāi)屬性和宿主對(duì)象的聯(lián)系,而不會(huì)去操作屬性中的屬性。
delete book.author; // book不再有屬性author delete book["main title"]; // book 也不再有屬性"main title"
delete運(yùn)算符只能刪除自有屬性,不能刪除繼承屬性(要?jiǎng)h除繼承屬性必須從定義這個(gè)屬性的原型對(duì)象.上刪除它,而且這會(huì)影響到所有繼承自這個(gè)原型的對(duì)象)。
舉例:
a = { p: { x: 1 } }; b = a.p; delete a.p; b.x //=>1,執(zhí)行這段代碼之后b.x的值依然是1
由于已經(jīng)刪除的屬性的引用依然存在,因此在JavaScript的某些實(shí)現(xiàn)中,可能因?yàn)檫@種不嚴(yán)謹(jǐn)?shù)拇a而造成內(nèi)存泄漏。所以在銷(xiāo)毀對(duì)象的時(shí)候,要遍歷屬性中的屬性,依次刪除。
當(dāng)delete表達(dá)式刪除成功或沒(méi)有任何副作用(比如刪除不存在的屬性)時(shí),它返回true。如果delete后不是一個(gè)屬性訪問(wèn)表達(dá)式,delete同樣返回true:
delete不能刪除那些可配置性為false的屬性(盡管可以刪除不可擴(kuò)展對(duì)象的可配置屬性)。某些內(nèi)置對(duì)象的屬性是不可配置的,比如通過(guò)變量聲明和函數(shù)聲明創(chuàng)建的全局對(duì)象的屬性。在嚴(yán)格模式中,刪除一個(gè)不可配置屬性會(huì)報(bào)一個(gè)類(lèi)型錯(cuò)誤。
屬性檢測(cè) 1. isPrototypeOf()方法檢測(cè)一個(gè)對(duì)象是否是另一個(gè)對(duì)象的原型?;蛘哒f(shuō)一個(gè)對(duì)象是否被包含在另一個(gè)對(duì)象的原型鏈中
實(shí)例一:
var p = {x:1}; //定義一個(gè)原型對(duì)象 var o = Object.create(p); //使用這個(gè)原型創(chuàng)建一個(gè)對(duì)象 p.isPrototypeOf(o); //=>true:o繼承p Object.prototype.isPrototypeOf(p); //=> true, p繼承自O(shè)bject.prototype
實(shí)例二:
function Animal(){ this.species = "動(dòng)物"; }; var eh = new Animal(); Animal.prototype.isPrototypeOf(eh) //=>true
綜合上面的兩個(gè)例子,我們發(fā)現(xiàn)在調(diào)用isPrototypeOf()的時(shí)候有三種方式
p.isPrototypeOf(o); //=>true Object.prototype.isPrototypeOf(p); Animal.prototype.isPrototypeOf(eh) //=>true
總結(jié)一下就是:
通過(guò)Object.create()創(chuàng)建的對(duì)象使用第一個(gè)參數(shù)作為原型2. instanceof 運(yùn)算符
通過(guò)對(duì)象直接量的對(duì)象使用Object.prototype作為原型
通過(guò)new創(chuàng)建的對(duì)象使用構(gòu)造函數(shù)的prototype屬性作為原型
Instanceof運(yùn)算符希望左操作數(shù)是一個(gè)對(duì)象,右操作數(shù)標(biāo)識(shí)對(duì)象的類(lèi)。如果左側(cè)對(duì)象是右側(cè)類(lèi)的實(shí)例,則表達(dá)式返回為true,否則返回false。
javascript var d = new Date(); d instanceof Date; //=>true d是Date的實(shí)例 d instanceof Object; //=>true 所有對(duì)象都是Object的實(shí)
當(dāng)通過(guò)instanceof判斷一個(gè)對(duì)象是否是一個(gè)類(lèi)的實(shí)例的時(shí)候,這個(gè)判斷也會(huì)包含對(duì)父類(lèi)的檢測(cè)。盡管instanceof的右操作數(shù)是構(gòu)造函數(shù),但計(jì)算過(guò)程實(shí)際是檢測(cè)了對(duì)象的繼承關(guān)系。
instanceOf與isPrototypeOf簡(jiǎn)單總結(jié)
var d = new Date(); Date.prototype.isPrototypeOf(d); //=>true d instanceof Date; //=>true
* 如果Date.prototype是d的原型,那么d一定是Date的實(shí)例。 * 缺點(diǎn)為無(wú)法同對(duì)象來(lái)獲得類(lèi)型,只能檢測(cè)對(duì)象是否屬于類(lèi)名 * 在多窗口和多框架的子頁(yè)面的web應(yīng)用中兼容性不佳。其中一個(gè)典型代表就是instanceof操作符不能視為一個(gè)可靠的數(shù)組檢測(cè)方法。3. hasOwnProperty()方法
對(duì)象的hasOwnProperty()方法用來(lái)檢測(cè)給定的名字是否是對(duì)象的自有屬性。對(duì)于繼承屬性它將返回false:
var o = { x: 1 } o.hasOwnProperty("x"); // true: o有一個(gè)自有屬性x o.hasOwnProperty("y"); // false: o中不存在屬性y o.hasOwnProperty("toString"); // false: toString是繼承屬性4. in操作符
in運(yùn)算符左側(cè)是屬性名,右側(cè)是對(duì)象,如果對(duì)象的自有屬性或者繼承屬性中包含這個(gè)屬性則返回true。
var o = { x = 1 } "x" in o; // =>true "y" in o; // =>false "toString" in o; // =>true: toString是繼承屬性5. propertyIsEnumberable()方法
只有檢測(cè)到是自有屬性且這個(gè)屬性可枚舉(enumberable attribute)為true時(shí)它才返回true。某些內(nèi)置屬性是不能枚舉的。
var o = inherit({ y: 2 }); o.x = 1; o.propertyIsEnumerable("x"); // true: o有一個(gè)可枚舉的自有屬性x o.propertyIsEnumerable("y"); // false: y是繼承來(lái)的 Object.prototype.propertyIsEnumerable("toString"); // false: 不可枚舉枚舉屬性 1. for/in循環(huán)
可以在循環(huán)體中遍歷對(duì)象中所有可枚舉的屬性(包括自有屬性和繼承的屬性),把屬性名稱(chēng)賦值給循環(huán)變量。對(duì)象繼承的內(nèi)置方法不可枚舉的,但在代碼中給對(duì)象添加的屬性都是可枚舉的(除非用下文中提到的一個(gè)方法將它們轉(zhuǎn)換為不可枚舉的)。例如:
var o = {x:1, y:2, z:3}; //三個(gè)可枚舉的自有屬性 o.propertyIsEnumerable("toString") // =>false, 不可枚舉 for(p in o) //遍歷屬性 console.log(p); //輸出x、y和z,不會(huì)輸出toString
有許多實(shí)用工具庫(kù)給0bject.prototype添加了新的方法或?qū)傩裕@些方法和屬性可以被所有對(duì)象繼承并使用。然而在ECMAScript 5標(biāo)準(zhǔn)之前,這些新添加的方法是不能定義為不可枚舉的,因此它們都可以在for/i n循環(huán)中枚舉出來(lái)。為了避免這種情況,需要過(guò)濾for/in循環(huán)返回的屬性,下面兩種方式是最常見(jiàn)的:
for(p in o) { if (!o. hasOwnProperty(p)) continue; // 跳過(guò)繼承的屬性 } for(p in o) { if (typeof o[p] === "function") continue; // 跳過(guò)方法 }2. Object.getOwnPropertyNames()方法
返回一個(gè)由指定對(duì)象的所有自身屬性的屬性名(包括不可枚舉屬性但不包括Symbol值作為名稱(chēng)的屬性)組成的數(shù)組。
var arr = ["a", "b", "c"]; console.log(Object.getOwnPropertyNames(arr).sort()); // ["0", "1", "2", "length"] // 類(lèi)數(shù)組對(duì)象 var obj = { 0: "a", 1: "b", 2: "c"}; console.log(Object.getOwnPropertyNames(obj).sort()); // ["0", "1", "2"] // 使用Array.forEach輸出屬性名和屬性值 Object.getOwnPropertyNames(obj).forEach(function(val, idx, array) { console.log(val + " -> " + obj[val]); }); // 輸出 // 0 -> a // 1 -> b // 2 -> c //不可枚舉屬性 var my_obj = Object.create({}, { getFoo: { value: function() { return this.foo; }, enumerable: false } }); my_obj.foo = 1; console.log(Object.getOwnPropertyNames(my_obj).sort()); // ["foo", "getFoo"]3. Object.keys()方法
返回一個(gè)由一個(gè)給定對(duì)象的自身可枚舉屬性組成的數(shù)組,數(shù)組中屬性名的排列順序和使用for…in循環(huán)遍歷該對(duì)象時(shí)返回的順序一致 。如果對(duì)象的鍵-gs值都不可枚舉,那么將返回由鍵組成的數(shù)組。
// simple array var arr = ["a", "b", "c"]; console.log(Object.keys(arr)); // console: ["0", "1", "2"] // array like object var obj = { 0: "a", 1: "b", 2: "c" }; console.log(Object.keys(obj)); // console: ["0", "1", "2"] // array like object with random key ordering var anObj = { 100: "a", 2: "b", 7: "c" }; console.log(Object.keys(anObj)); // console: ["2", "7", "100"] // getFoo is a property which isn"t enumerable var myObj = Object.create({}, { getFoo: { value: function () { return this.foo; } } }); myObj.foo = 1; console.log(Object.keys(myObj)); // console: ["foo"]屬性的特性
我們將存取器屬性的getter和setter方法看成是屬性的特性。按照這個(gè)邏輯, 我們也可以把數(shù)據(jù)屬性的值同樣看做屬性的特性。因此,可以認(rèn)為一個(gè)屬性包含一個(gè)名字和4個(gè)特性。
數(shù)據(jù)屬性的4個(gè)特性分別是它的值(value) 、可寫(xiě)性(writable) 、可枚舉性(enumerable) 和可配置性(configurable) 。
存取器屬性不具有值(value) 特性和可寫(xiě)性,它們的可寫(xiě)性是由setter方法存在與否決定的。因此存取器屬性的4個(gè)特性是讀取(get)、寫(xiě)入(set)、可枚舉性和可配置性。
為了實(shí)現(xiàn)屬性特性的查詢(xún)和設(shè)置操作,ECMAScript 5中定義了一個(gè)名為“屬性描述符”(property descriptor)的對(duì)象,這個(gè)對(duì)象代表那4個(gè)特性。描述符對(duì)象的屬性和它們所描述的屬性特性是同名的。
因此,數(shù)據(jù)屬性的描述符對(duì)象的屬性有value、writable.enumerable和configurable。存取器屬性的描述符對(duì)象則用get屬性和set屬性代替value和writable。其中writable、 enumerable和configurable都是布爾值,當(dāng)然,get屬性和set屬性是函數(shù)值。
對(duì)象的三個(gè)屬性每一個(gè)對(duì)象都有與之相關(guān)的原型(prototype) 、類(lèi)(class) 和可擴(kuò)展性(extensible attribute)。
原型屬性
對(duì)象的原型屬性是用來(lái)繼承屬性的,這個(gè)屬性如此重要,以至于我們經(jīng)常把“o的原型屬性”直接叫做“o的原型”。
原型屬性是在實(shí)例對(duì)象創(chuàng)建之初就設(shè)置好的,通過(guò)對(duì)象直接量創(chuàng)建的對(duì)象使用Object. prototype作為它們的原型。通過(guò)new創(chuàng)建的對(duì)象使用構(gòu)造函數(shù)的prototype屬性作為它們的原型。通過(guò)Object.create() 創(chuàng)建的對(duì)象使用第一-個(gè)參數(shù)(也可以是null)作為它們的原型。
類(lèi)屬性
對(duì)象的類(lèi)屬性(class attribute) 是-一個(gè)字符串,用以表示對(duì)象的類(lèi)型信息。ECMAScript3和ECMAScript 5都未提供設(shè)置這個(gè)屬性的方法,并只有一種間接的方法可以查詢(xún)它。默認(rèn)的toString()方法(繼承自O(shè)bject.prototype)返回了如下這種格式的字符串:[object class]
因此,要想獲得對(duì)象的類(lèi),可以調(diào)用對(duì)象的toString()方法,然后提取已返回字符串的第8個(gè)到倒數(shù)第二個(gè)位置之間的字符。
可拓展性
對(duì)象的可擴(kuò)展性用以表示是否可以給對(duì)象添加新屬性。所有內(nèi)置對(duì)象和自定義對(duì)象都是顯式可擴(kuò)展的,宿主對(duì)象的可擴(kuò)展性是由JavaScript引擎定義的。在ECMAScript 5中,所有的內(nèi)置對(duì)象和自定義對(duì)象都是可擴(kuò)展的,除非將它們轉(zhuǎn)換為不可擴(kuò)展的,同樣,宿主對(duì)象的可擴(kuò)展性也是由實(shí)現(xiàn)ECMAScript 5的JavaScript引擎定義的。
對(duì)象序列化(serialization) 是指將對(duì)象的狀態(tài)轉(zhuǎn)換為字符串,也可將字符串還原為對(duì)象。ECMAScript 5提供了內(nèi)置函數(shù)JSON.stringify()和JSON.parse()用來(lái)序列化和還原JavaScript對(duì)象。這些方法都使用JSON作為數(shù)據(jù)交換格式,JSON的全稱(chēng)是“JavaScript Object Notation" 一JavaScript對(duì)象表示法,它的語(yǔ)法和JavaScript對(duì)象與數(shù)組直接量的語(yǔ)法非常相近:
o = {x:1, y:{z:[false, null, ""]}}; //定義一個(gè)測(cè)試對(duì)象 s = JSON.stringify(o); // s是"{"x":1,"y":{"z" :[false, null, ""]}}" p = JSON.parse(s); // p是o的深拷貝
參考:
* 《JavaScript權(quán)威指南》第六版 * [MDN Web 文檔](https://developer.mozilla.org/zh-CN/)
推薦閱讀:
【專(zhuān)題:JavaScript進(jìn)階之路】
JavaScript之“use strict”
JavaScript之new運(yùn)算符
JavaScript之call()理解
我是Cloudy,年輕的前端攻城獅一枚,愛(ài)專(zhuān)研,愛(ài)技術(shù),愛(ài)分享。
個(gè)人筆記,整理不易,感謝閱讀、點(diǎn)贊和收藏。
文章有任何問(wèn)題歡迎大家指出,也歡迎大家一起交流前端各種問(wèn)題!
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/105326.html
摘要:對(duì)象數(shù)組初始化表達(dá)式,闖關(guān)記之上文檔對(duì)象模型是針對(duì)和文檔的一個(gè)。闖關(guān)記之?dāng)?shù)組數(shù)組是值的有序集合。數(shù)組是動(dòng)態(tài)的,根闖關(guān)記之語(yǔ)法的語(yǔ)法大量借鑒了及其他類(lèi)語(yǔ)言如和的語(yǔ)法。 《JavaScript 闖關(guān)記》之 DOM(下) Element 類(lèi)型 除了 Document 類(lèi)型之外,Element 類(lèi)型就要算是 Web 編程中最常用的類(lèi)型了。Element 類(lèi)型用于表現(xiàn) XML 或 HTML 元素...
摘要:深入系列第四篇,具體講解執(zhí)行上下文中的變量對(duì)象與活動(dòng)對(duì)象。下一篇文章深入之作用域鏈本文相關(guān)鏈接深入之執(zhí)行上下文棧深入系列深入系列目錄地址。 JavaScript深入系列第四篇,具體講解執(zhí)行上下文中的變量對(duì)象與活動(dòng)對(duì)象。全局上下文下的變量對(duì)象是什么?函數(shù)上下文下的活動(dòng)對(duì)象是如何分析和執(zhí)行的?還有兩個(gè)思考題幫你加深印象,快來(lái)看看吧! 前言 在上篇《JavaScript深入之執(zhí)行上下文?!分?..
摘要:深入系列第七篇,結(jié)合之前所講的四篇文章,以權(quán)威指南的為例,具體講解當(dāng)函數(shù)執(zhí)行的時(shí)候,執(zhí)行上下文棧變量對(duì)象作用域鏈?zhǔn)侨绾巫兓?。前言在深入之?zhí)行上下文棧中講到,當(dāng)代碼執(zhí)行一段可執(zhí)行代碼時(shí),會(huì)創(chuàng)建對(duì)應(yīng)的執(zhí)行上下文。 JavaScript深入系列第七篇,結(jié)合之前所講的四篇文章,以權(quán)威指南的demo為例,具體講解當(dāng)函數(shù)執(zhí)行的時(shí)候,執(zhí)行上下文棧、變量對(duì)象、作用域鏈?zhǔn)侨绾巫兓摹?前言 在《Jav...
摘要:返回值是一個(gè)對(duì)象,如果是訪問(wèn)器屬性,這個(gè)對(duì)象的屬性有和如果是數(shù)據(jù)屬性,這個(gè)對(duì)象的屬性有和。上一篇面向?qū)ο蟀鎵K之對(duì)象屬性下一篇面向?qū)ο蟀鎵K之創(chuàng)建對(duì)象 這是 javascript 面向?qū)ο蟀鎵K的第三篇文章,主要講解的是多個(gè)屬性的定義以及讀取屬性的特性。前面這幾章內(nèi)容目的在于加深對(duì)對(duì)象的理解,這樣可以利于理解后面的原型鏈以及繼承方面的知識(shí),或者你也可以了解一下不一樣的 javascript ...
摘要:下面,讓我們以一個(gè)函數(shù)的創(chuàng)建和激活兩個(gè)時(shí)期來(lái)講解作用域鏈?zhǔn)侨绾蝿?chuàng)建和變化的。這時(shí)候執(zhí)行上下文的作用域鏈,我們命名為至此,作用域鏈創(chuàng)建完畢。 JavaScript深入系列第五篇,講述作用鏈的創(chuàng)建過(guò)程,最后結(jié)合著變量對(duì)象,執(zhí)行上下文棧,讓我們一起捋一捋函數(shù)創(chuàng)建和執(zhí)行的過(guò)程中到底發(fā)生了什么? 前言 在《JavaScript深入之執(zhí)行上下文?!分兄v到,當(dāng)JavaScript代碼執(zhí)行一段可執(zhí)行代...
摘要:深入系列的第一篇,從原型與原型鏈開(kāi)始講起,如果你想知道構(gòu)造函數(shù)的實(shí)例的原型,原型的原型,原型的原型的原型是什么,就來(lái)看看這篇文章吧。讓我們用一張圖表示構(gòu)造函數(shù)和實(shí)例原型之間的關(guān)系在這張圖中我們用表示實(shí)例原型。 JavaScript深入系列的第一篇,從原型與原型鏈開(kāi)始講起,如果你想知道構(gòu)造函數(shù)的實(shí)例的原型,原型的原型,原型的原型的原型是什么,就來(lái)看看這篇文章吧。 構(gòu)造函數(shù)創(chuàng)建對(duì)象 我們先...
閱讀 3380·2021-11-04 16:10
閱讀 3877·2021-09-29 09:43
閱讀 2714·2021-09-24 10:24
閱讀 3385·2021-09-01 10:46
閱讀 2523·2019-08-30 15:54
閱讀 603·2019-08-30 13:19
閱讀 3252·2019-08-29 17:19
閱讀 1068·2019-08-29 16:40