摘要:注意,此處的構造函數指的是使用方式的構造函數。也就是說,你可以在支持該實現的瀏覽器下,,,去訪問對象的構造函數的原型對象。另外一種判斷實例對象和其原型對象存在指向關系由實例的指向其構造函數的原型對象的方法是。
這里,我們列出原型的幾個概念,如下:
prototype屬性
[[prototype]]
__proto__
prototype屬性只要創建了一個函數,就會為該函數創建一個prototype屬性,指向該函數的原型對象。實例對象是不會擁有該屬性的。
默認情況下,該原型對象也會獲得一個constructor屬性,該屬性包含一個指針,指向prototype屬性所在的函數。
function Person() {}// 只是一個函數而已 Person.prototype.constructor === Person[[prototype]]和__proto__
javascript中,不可以訪問的內部屬性都是用[[propertyName]]這種形式來表示的,比如還有枚舉屬性[[Enumberable]]。
[[prototype]]屬性只能是對象可以擁有的屬性。比如實例化的對象以及原型對象,而不是構造函數。這個屬性指向擁有其屬性的對象的構造函數的原型對象。注意,此處的構造函數指的是使用new方式的構造函數。并不因為更改了原型對象上的constructor屬性而改變。
比如:
function Person() {} Person.prototype.constructor = {}; // 此處修改了Person原型的構造函數指向 let p = new Person(); p.__proto__ === Person.prototype; // true
__proto__是個啥呢,就是對[[propertyName]]的實現。也就是說,你可以在支持該實現的瀏覽器下(FF,chrome,safari),去訪問對象的構造函數的原型對象。比如:
var Person = function(name) { this.name = name; }; var p1 = new Person(); p1.__proto__=== Person.prototype; // true Person.prototype = {}; var p2 = new Person(); p2.__proto__ === Object.prototype; // false
當然,__proto__只是瀏覽器的私有實現,目前ECMAScript標準實現方法是Object.getPrototypeOf(object)。
var Person = function(name) { this.name = name; }; var p1 = new Person(); Object.getPrototypeOf(p1) === Person.prototype; // true Person.prototype = {}; var p2 = new Person(); Object.getPrototypeOf(p2) === Object.prototype; // false
另外一種判斷實例對象和其原型對象存在指向關系(由實例的[[prototype]]指向其構造函數的原型對象)的方法是:isPrototypeOf。比如:
Person.prototype.isPrototypeOf(p1); // true
由于函數和原型對象也是一個對象,所以,它自然而然也擁有[[prototype]]屬性。
弄清楚了這些概念,原型鏈,繼承等存在的一些問題,都不是問題了。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/78159.html
摘要:首先,需要來理清一些基礎的計算機編程概念編程哲學與設計模式計算機編程理念源自于對現實抽象的哲學思考,面向對象編程是其一種思維方式,與它并駕齊驅的是另外兩種思路過程式和函數式編程。 JavaScript 中的原型機制一直以來都被眾多開發者(包括本人)低估甚至忽視了,這是因為絕大多數人沒有想要深刻理解這個機制的內涵,以及越來越多的開發者缺乏計算機編程相關的基礎知識。對于這樣的開發者來說 J...
摘要:我們已經回答了的構造函數和原型都是誰的問題,現在牽扯出來一個,我們繼續檢查的構造函數是全局對象上屬性叫的對象的原型是個匿名函數,按照關于構造函數的約定,它應該是構造函數的屬性我們給這個對象起個名字,叫。 我不確定JavaScript語言是否應該被稱為Object-Oriented,因為Object Oriented是一組語言特性、編程模式、和設計與工程方法的籠統稱謂,沒有一個詳盡和大家...
摘要:這正是我們想要的太棒了毫不意外的,這種繼承的方式被稱為構造函數繼承,在中是一種關鍵的實現的繼承方法,相信你已經很好的掌握了。 你應該知道,JavaScript是一門基于原型鏈的語言,而我們今天的主題 -- 繼承就和原型鏈這一概念息息相關。甚至可以說,所謂的原型鏈就是一條繼承鏈。有些困惑了嗎?接著看下去吧。 一、構造函數,原型屬性與實例對象 要搞清楚如何在JavaScript中實現繼承,...
摘要:是完全的面向對象語言,它們通過類的形式組織函數和變量,使之不能脫離對象存在。而在基于原型的面向對象方式中,對象則是依靠構造器利用原型構造出來的。 JavaScript 函數式腳本語言特性以及其看似隨意的編寫風格,導致長期以來人們對這一門語言的誤解,即認為 JavaScript 不是一門面向對象的語言,或者只是部分具備一些面向對象的特征。本文將回歸面向對象本意,從對語言感悟的角度闡述為什...
摘要:原型之所以被稱為原型,可能正是因為這種不可重載的特質。而一旦實例化,那么將指向實例化的對象。首先是,我使用了,直接利用貓咪的年齡進行計算得出體重返回給屬性。 和java比起來,javascript真的是松散的無以復加,不過這也讓我們在無聊之余,有精力去探討一些復雜的應用,從而在開發之路上,獲得一些新的想法。 javascript中的類的構造 javascript中有對象的概念,卻沒有類...
閱讀 5078·2023-04-25 19:30
閱讀 2173·2023-04-25 15:09
閱讀 2618·2021-11-16 11:45
閱讀 2171·2021-11-15 18:07
閱讀 1458·2021-11-11 17:22
閱讀 2115·2021-11-04 16:06
閱讀 3576·2021-10-20 13:47
閱讀 3036·2021-09-22 16:03