摘要:一,檢測左側的原型鏈上,是否存在右側的原型我在之前的兩篇文章高手之路構造函數的基本特性與優缺點高手之路一步步圖解的原型對象原型鏈已經分享過了衛莊二如果隱式原型指向調用方法的對象原型那么這個方法就返回,如衛莊因為的隱式原型指向的都是,有朋友可
一,instanceof:
instanceof檢測左側的__proto__原型鏈上,是否存在右側的prototype原型. 我在之前的兩篇文章
[js高手之路]構造函數的基本特性與優缺點
[js高手之路]一步步圖解javascript的原型(prototype)對象,原型鏈
已經分享過了.
1 function CreateObj(uName) { 2 this.userName = uName; 3 this.showUserName = function () { 4 return "100"; 5 } 6 } 7 CreateObj.prototype.showUserName = function () { 8 return this.userName; 9 } 10 var obj1 = new CreateObj("ghostwu"); 11 var obj2 = new CreateObj("衛莊"); 12 13 console.log( obj1 instanceof CreateObj ); //true 14 console.log( obj2 instanceof CreateObj ); //true 15 console.log( obj1 instanceof Object ); //true 16 console.log( obj2 instanceof Object ); //true
二、isPrototypeOf:
如果隱式原型__proto__指向調用isPrototypeOf()方法的對象原型( CreateObj ), 那么這個方法就返回true,如:
1 var obj1 = new CreateObj("ghostwu"); 2 var obj2 = new CreateObj("衛莊"); 3 console.log( CreateObj.prototype.isPrototypeOf( obj1 ) ); //true 4 console.log( CreateObj.prototype.isPrototypeOf( obj2 ) ); //true
因為obj1,obj2的隱式原型__proto__指向的都是CreateObj.prototype, 有朋友可能會問CreateObj.prototype上面根本就沒有isPrototypeOf這個方法,怎么可以
調用呢?
是的,沒錯,但是CreateObj.prototype的隱式原型__proto__指向了Object.prototype, 而isPrototypeOf存在Object.prototype上,所以就能夠調用
三、Object.getPrototypeOf
獲取實例的隱式原型(__proto__)的指向,因為obj1,obj2的__proto__都指向CreateObj.prototype
1 var obj1 = new CreateObj("ghostwu"); 2 var obj2 = new CreateObj("衛莊"); 3 console.log( Object.getPrototypeOf( obj1 ) === CreateObj.prototype ); //true 4 console.log( Object.getPrototypeOf( obj2 ) === CreateObj.prototype ); //true
四,實例訪問屬性和方法時,遵循就近查找原則
實例先在自己身上查找,有,就停止查找,如果沒有,就沿著實例的__proto__繼續往上查找,有,就停止查找,如果沒有就繼續沿著原型鏈一直往上查找,如果
所有的原型對象上都沒有,那就是undefined.
1 function CreateObj(uName) { 2 this.userName = uName; 3 } 4 CreateObj.prototype.showUserName = function () { 5 return this.userName; 6 } 7 CreateObj.prototype.age = 22; 8 9 var obj1 = new CreateObj("ghostwu"); 10 obj1.age = 20; 11 var obj2 = new CreateObj("衛莊"); 12 13 console.log( obj1.age ); //20--->來自實例 14 console.log( obj2.age ); //22--->來自原型對象 15 16 delete obj1.age; 17 console.log( obj1.age ); //22--->來自原型
五,hasOwnProperty
判斷屬性是實例上的還是原型對象上的,如果是實例上的,返回true, 原型上的返回false
1 function CreateObj(uName) { 2 this.userName = uName; 3 } 4 CreateObj.prototype.showUserName = function () { 5 return this.userName; 6 } 7 CreateObj.prototype.age = 22; 8 var obj1 = new CreateObj("ghostwu"); 9 obj1.age = 20; 10 var obj2 = new CreateObj("衛莊"); 11 console.log( obj1.age ); //20--->來自實例 12 console.log( obj1.hasOwnProperty( "age" ) ); //true 13 console.log( obj2.age ); //22--->來自原型對象 14 console.log( obj2.hasOwnProperty( "age" ) ); //false 15 delete obj1.age; 16 console.log( obj1.age ); //22--->來自原型 17 console.log( obj1.hasOwnProperty( "age" ) ); //false
六、in操作符
判斷屬性是否在實例或者原型對象上,只要一個滿足條件,返回值都是true
1 function CreateObj(uName) { 2 this.userName = uName; 3 } 4 CreateObj.prototype.showUserName = function () { 5 return this.userName; 6 } 7 CreateObj.prototype.age = 22; 8 var obj1 = new CreateObj("ghostwu"); 9 obj1.age = 20; 10 console.log( "age" in obj1 ); //true 11 var obj2 = new CreateObj("衛莊"); 12 console.log( "age" in obj2 ); //true 13 delete obj1.age; 14 console.log( "age" in obj1 ); //true 15 console.log( "user" in obj1 ); //false 16 console.log( "user" in obj2 ); //false
七,結合in和hasOwnProperty的用法,可以封裝一個函數判斷這個屬性是否在原型對象上, 返回值為true:在原型對象上, false:不在原型對象上
1 function CreateObj(uName) { 2 this.userName = uName; 3 } 4 CreateObj.prototype.showUserName = function () { 5 return this.userName; 6 } 7 CreateObj.prototype.age = 20; 8 function hasPrototypeProperty( obj, name ){ 9 return !obj.hasOwnProperty( name ) && ( name in obj ); 10 } 11 var obj1 = new CreateObj("ghostwu"); 12 var obj2 = new CreateObj("衛莊"); 13 obj1.age = 10; 14 console.log( hasPrototypeProperty( obj1, "age" ) ); //false 15 console.log( hasPrototypeProperty( obj2, "age" ) ); //true
八、for...in 可以枚舉實例和原型對象上的屬性和方法,前提是:該屬性和方法是可以枚舉的
1 function CreateObj(uName) { 2 this.userName = uName; 3 } 4 CreateObj.prototype.showUserName = function () { 5 return this.userName; 6 } 7 CreateObj.prototype.age = 20; 8 var obj = new CreateObj( "ghostwu" ); 9 10 for( var key in obj ){ 11 console.log( key ); //userName,age,showUserName 12 } 13 console.log( Object.prototype ); 14 for( var key in Object.prototype ){ 15 console.log( key );//枚舉不了, Object.prototype上的屬性和方法默認不可枚舉,枚舉屬性為false 16 }
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/85050.html
摘要:所以一句話理解的運算規則為檢測左側的原型鏈上,是否存在右側的原型。 上文,通過基本的對象創建問題了解了構造函數,本文,我們接著上文繼續了解構造函數的基本特性,以及優缺點. 每個對象上面都有一個constructor屬性( 嚴格意義上來說,是原型上的,對象是通過查找到原型找到 constructor屬性 ).后面講到原型的時候,我會用示意圖的方式說明 1 functio...
摘要:當然這還沒完,因為我們還有重要的一步沒完成,沒錯就是上面的第行代碼,如果沒有這行代碼實例中的指針是指向構造函數的,這樣顯然是不對的,因為正常情況下應該指向它的構造函數,因此我們需要手動更改使重新指向對象。 第一節內容:javaScript原型及原型鏈詳解(二) 第一節中我們介紹了javascript中的原型和原型鏈,這一節我們來講利用原型和原型鏈我們可以做些什么。 普通對象的繼承 ...
摘要:其實的面向對象很多原理和機制還是的,只不過把語法改成類似和老牌后端語言中的面向對象語法一用封裝一個基本的類是不是很向和中的類其實本質還是原型鏈,我們往下看就知道了首先說下語法規則中的就是類名,可以自定義就是構造函數,這個是關鍵字,當實例化對 其實es6的面向對象很多原理和機制還是ES5的,只不過把語法改成類似php和java老牌后端語言中的面向對象語法. 一、用es6封裝一個基本的類 ...
摘要:原型對象的共享特性,可以很方便的為一些內置的對象擴展一些方法,比如,數組去重復但是,不要隨便往內置的對象上面擴展方法,在多人協作開發,很容易產生覆蓋,以及污染 我們先來一個簡單的構造函數+原型對象的小程序 1 function CreateObj( uName, uAge ) { 2 this.userName = uName; 3 ...
摘要:原型對象內部也有一個指針屬性指向構造函數實例可以訪問原型對象上定義的屬性和方法。在創建子類型的實例時,不能向超類型的構造函數中傳遞參數。 贊助我以寫出更好的文章,give me a cup of coffee? 2017最新最全前端面試題 私有變量和函數 在函數內部定義的變量和函數,如果不對外提供接口,外部是無法訪問到的,也就是該函數的私有的變量和函數。 function ...
閱讀 3702·2021-11-11 10:58
閱讀 2486·2021-09-22 15:43
閱讀 2875·2019-08-30 15:44
閱讀 2196·2019-08-30 13:08
閱讀 1827·2019-08-29 17:28
閱讀 893·2019-08-29 10:54
閱讀 683·2019-08-26 11:46
閱讀 3512·2019-08-26 11:43