日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

「JavaScript面向对象编程指南」原型

發布時間:2024/4/15 javascript 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 「JavaScript面向对象编程指南」原型 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

在 JS 中,函數本身也是一個包含了方法(如apply和call)和屬性(如length和constructor)的對象,而prototype也是函數對象的一個屬性
function f(){}
f.constructor //function Function(){[native code]}
可為prototype對象賦予屬性和方法,只有當f作為構造器使用時,這些屬性才會起作用

添加屬性和方法除了在構造函數中,還可通過prototype屬性來增加該構造器所能提供的功能

function Snake(name){this.name = name;this.eat = function(){} } Snake.prototype.color = 'grey'; Snake.prototype.sleep = function(){}

若不想逐一添加,也可定義一個對象,然后將其覆蓋到之前原型上

Snake.prototype = {color:'grey';sleep:function(){} }

在 JS 中,幾乎所有對象都是通過傳引用的方式來傳遞的,因此所創建的每個新對象實體中并沒
有一份屬于自己原型副本。這也就意味著可隨時修改 prototype 屬性,并且由同
一構造器創建的所有對象的 prototype 屬性也都會同時改變(甚至還會影響在修改之前
就已經創建了的那些對象)

訪問某個屬性時,JS引擎會遍歷該對象的所有屬性,找到則立即返回,找不到則會去創建當前對象的構造器函數的原型里找

每個對象都會有一個構造器,而原型本身也是一個對象,這意味著它必然也有一個構造器,而這個構造器又會有自己的
原型。于是這種結構可能會一直不斷地持續下去,并最終取決于原型鏈(prototype chain)的長度,但其最后一環肯定是 Object 內建對象,因為它是最高級的父級對象。

使用hasOwnProperty()方法可判斷某屬性是對象自身屬性還是原型屬性,返回布爾類型,false為原型屬性

對象中不是所有的屬性都會在 for-in 循環中顯示,如(數組的)length 屬性和
constructor 屬性就不會被顯示,那些會顯示的屬性被稱枚舉屬性,可以通過各個對象所提供的 propertyIsEnumerable()方法來判斷對象的某
個屬性是否可枚舉,在 ES5 中,可以具體指定哪些屬性可枚舉,而在 ES3 中沒有這個功能
for-in中原型鏈中的各個原型屬性也會被顯示出來,當然前提是它們是可枚舉的
對于所有的原型屬性,propertyIsEnumerable()都會返回 false,包括那些在 for-in 循環中可枚舉的屬性

function Gadget(name, color) {this.name = name;this.color = color;this.getName = function(){return this.name;}; } Gadget.prototype.price = 100; Gadget.prototype.rating = 3;var newtoy = new Gadget('webcam','black');for(var k in newtoy){if(newtoy.hasOwnProperty(k)){console.log(k + '=' + newtoy[k]); //打印自身的可枚舉屬性} }newtoy.propertyIsEnumerable('name'); //true//而對于內建屬性和方法來說,它們大部分都是不可枚舉的: newtoy.propertyIsEnumerable('constructor'); //false//另外,任何來自原型鏈中的屬性也是不可枚舉的: newtoy.propertyIsEnumerable('price'); //false//但是需要注意的是,如果 propertyIsEnumerable()的調用是來自原型鏈上的某個對象,那么該對象中的屬性是可枚舉的 newtoy.constructor.prototype.propertyIsEnumerable('price'); //true

每個對象都有個isPrototypeOf()方法,用以判斷當前對象是否是另一個對象的原型

var monkey = { name:'Sam' }; function Human(){}; Human.prototype = monkey;var george = new Human();//monkey是george的原型嗎? monkey.isPrototypeOf(george); //true

大多數瀏覽器可得到某個對象的原型,因為大多數瀏覽器都實現了ES5的Object.getPrototypeOf()方法
Object.getPrototypeOf(george) //{ name:'Sam' }

在IE中不存在__proto__,另外__proto__和prototype并不是等價的
**__proto__實際上是某個實例對象的屬性,而prototype則是屬于構造器函數的屬性**

typeof george.__proto__; //"object"typeof george.prototype; //"undefined"typeof george.constructor.prototype; //"object"

所以__proto__只能在學習或調試的環境下使用

轉載于:https://www.cnblogs.com/Grani/p/10655005.html

超強干貨來襲 云風專訪:近40年碼齡,通宵達旦的技術人生

總結

以上是生活随笔為你收集整理的「JavaScript面向对象编程指南」原型的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。