JS 原型與原型鏈
1、proto
JS 在建立物件(不論是普通物件還是函式物件)的時候,都有一個叫做__proto__ 的內建屬性,用於指向建立它的建構函式的原型物件。
例如:Person person1 = new Person()
person1有一個__proto__屬性
建立它的建構函式是 Person
建構函式的原型物件是 Person.prototype ,所以:
person1.__proto__ == Person.prototype
根據這個連線圖,我們能得到:
Person.prototype.constructor == Person;
person1.__proto__ == Person.prototype;
person1.constructor == Person;
不過,要明確的真正重要的一點就是,這個連線存在於例項(person1)與建構函式(Person)的原型物件(Person.prototype)之間,而不是存在於例項(person1)與建構函式(Person)之間。
2、構造器
我們可以這樣建立一個物件:var obj = {}
它等同於下面這樣:var obj = new Object()
obj 是建構函式(Object)的一個例項。所以:
obj.constructor === Object
obj.proto === Object.prototype
新物件 obj 是使用 new 操作符後跟一個建構函式來建立的。建構函式(Object)本身就是一個函式(就是上面說的函式物件),它和上面的建構函式 Person 差不多。只不過該函式是出於建立新物件的目的而定義的。
同理,可以建立物件的構造器不僅僅有 Object,也可以是 Array,Date,Function等。所以也可以建構函式來建立 Array、 Date、Function
var b = new Array();
b.constructor === Array;
b.__proto__ === Array.prototype;
var c = new Date();
c.constructor === Date;
c.__proto__ === Date.prototype;
var d = new Function();
d.constructor === Function;
d.__proto__ === Function.prototype;
3、原型鏈
小測試來檢驗一下你理解的怎麼樣:
1、person1.proto 是什麼?
2、Person.proto 是什麼?
3、Person.prototype.proto 是什麼?
4、Object.proto 是什麼?
5、Object.prototype__proto__ 是什麼?
答案:
第一題:
因為 person1.proto === person1 的建構函式.prototype
因為 person1的建構函式 === Person
所以 person1.proto === Person.prototype
第二題:
因為 Person.proto === Person的建構函式.prototype
因為 Person的建構函式 === Function
所以 Person.proto === Function.prototype
第三題:
Person.prototype 是一個普通物件,我們無需關注它有哪些屬性,只要記住它是一個普通物件。
因為一個普通物件的建構函式 === Object
所以 Person.prototype.proto === Object.prototype
第四題,參照第二題,因為 Person 和 Object 一樣都是建構函式
第五題:
Object.prototype 物件也有proto屬性,但它比較特殊,為 null 。因為 null 處於原型鏈的頂端,這個只能記住。
Object.prototype.proto === null
4、函式物件
所有的構造器都來自於 Function.prototype,甚至包括根構造器Object及Function自身。所有構造器都繼承了·Function.prototype·的屬性及方法。如length、call、apply、bind**
Function.prototype也是唯一一個typeof XXX.prototype為 function的prototype。其它的構造器的prototype都是一個物件。如下(又:
console.log(typeof Function.prototype) // function
console.log(typeof Object.prototype) // object
console.log(typeof Number.prototype) // object
console.log(typeof Boolean.prototype) // object
console.log(typeof String.prototype) // object
console.log(typeof Array.prototype) // object
console.log(typeof RegExp.prototype) // object
console.log(typeof Error.prototype) // object
console.log(typeof Date.prototype) // object
console.log(typeof Object.prototype) // object
噢,上面還提到它是一個空的函式,console.log(Function.prototype) 下看看(留意,下一節會再說一下這個)
知道了所有構造器(含內建及自定義)的__proto__都是Function.prototype,那Function.prototype的__proto__是誰呢?
相信都聽說過JavaScript中函式也是一等公民,那從哪能體現呢?如下
console.log(Function.prototype.__proto__ === Object.prototype) // true
這說明所有的構造器也都是一個普通 JS 物件,可以給構造器新增/刪除屬性等。同時它也繼承了Object.prototype上的所有方法:toString、valueOf、hasOwnProperty等。(你也應該明白第一句話,第二句話我們下一節繼續說,不用挖坑了,還是剛才那個坑;))
最後Object.prototype的proto是誰?
Object.prototype.__proto__ === null // true
已經到頂了,為null。
五、 Prototype
https://www.jianshu.com/p/a4e1e7b6f4f8
參考於:https://www.jianshu.com/p/652991a67186
相關文章
- JS中的原型與原型鏈JS原型
- JS原型與原型鏈圖解JS原型圖解
- 深入理解JS原型與原型鏈JS原型
- JS原型和原型鏈JS原型
- js原型及原型鏈JS原型
- js基礎--原型物件與原型物件鏈JS原型物件
- 面試之JS篇 - 原型與原型鏈面試JS原型
- 原型與原型鏈原型
- JS基礎總結(2)——原型與原型鏈JS原型
- 2019 面試準備 - JS 原型與原型鏈面試JS原型
- 理解js中的原型,原型物件,原型鏈JS原型物件
- 【原型鏈汙染】Python與Js原型PythonJS
- js原型鏈JS原型
- JavaScript 原型 與 原型鏈JavaScript原型
- javascript——原型與原型鏈JavaScript原型
- JavaScript原型與原型鏈JavaScript原型
- 原型物件與原型鏈原型物件
- 原型、原型鏈與繼承原型繼承
- javascript之原型與原型鏈JavaScript原型
- JavaScript中原型與原型鏈JavaScript原型
- 一次性搞懂js中的原型與原型鏈JS原型
- 再解 JavaScript 原型與原型鏈JavaScript原型
- 7. JavaScript 原型與原型鏈JavaScript原型
- JavaScript系列之原型與原型鏈JavaScript原型
- 2024-05-10 js原型和原型鏈JS原型
- JS 中原型和原型鏈深入理解JS原型
- 前端筆記——JS基礎(原型&&原型鏈)前端筆記JS原型
- JS中的繼承與原型鏈JS繼承原型
- js原型鏈圖解JS原型圖解
- 淺析JS原型鏈JS原型
- js 原型鏈詳解JS原型
- JS原型鏈繼承JS原型繼承
- js回顧:原型鏈JS原型
- 巧解 JS 原型鏈JS原型
- JS原型鏈、prototype、__proto__、原型鏈繼承詳解JS原型繼承
- 深入JavaScript系列(六):原型與原型鏈JavaScript原型
- 說說JS中的原型物件和原型鏈JS原型物件
- js--原型和原型鏈相關問題JS原型