一. 普通物件與函式物件
JavaScript 中,萬物皆物件!但物件也是有區別的,分為普通物件和函式物件,Object 、Function 是 JS 自帶的函式物件,
o1 o2 o3 為普通物件,f1 f2 f3 為函式物件 (凡是通過 new Function() 創建的物件都是函式物件,其他的都是普通物件)
var o1 = {}; var o2 =new Object(); var o3 = new f1(); function f1(){}; var f2 = function(){}; var f3 = new Function('str','console.log(str)'); console.log(typeof Object); //function console.log(typeof Function); //function console.log(typeof f1); //function console.log(typeof f2); //function console.log(typeof f3); //function console.log(typeof o1); //object console.log(typeof o2); //object console.log(typeof o3); //object
建構式(擴展)
1.var a = {} 其實是 var a = new Object()的語法糖 (a 的建構式是 Object 函式)
2.var a = [] 其實是 var a = new Array()的語法糖 (a 的建構式是 Array 函式)
3.function Foo(){...}其實是 var Foo = new Function(...) (Foo 的建構式是 Function 函式)
二. 建構式
function Person(name, age, job) { this.name = name; this.age = age; this.job = job; this.sayName = function() { alert(this.name) } } var person1 = new Person('Zaxlct', 28, 'Software Engineer'); var person2 = new Person('Mick', 23, 'Doctor');
person1 和 person2 都是 Person 的實體,兩個實體都有一個 constructor (建構式)屬性,該屬性(是一個指標)指向 Person,其層級如下:

所以可以得出:
console.log(person1.constructor == Person); //true
console.log(person2.constructor == Person); //true
person1 和 person2 都是 建構式 Person 的實體
實體的建構式屬性(constructor)指向建構式
三. 原型物件

在 JavaScript 中,每當定義一個物件(函式也是物件)時候,物件中都會包含一些預定義的屬性,其中每個函式物件都有一個prototype 屬性(只有函式才有prototype,實體只有__proto__),這個屬性指向函式的原型物件,
注意:
1.只有函式才有prototype,實體(new Animal)只有__proto__
2.函式是Function的實體,函式的prototype是Object的實體
3.Function.__proto__ == Function.prototype
4.Object.prototype.__proto__ == null
比如:
function Animal() {}
const a = new Animal()
1. a.__proto__ == Animal.prototype
2. Animal.prototype.constructor == Animal
3. 只要用function宣告的Animal,就會帶一個prototype屬性,而Animal是Function的實體 【Animal instanceof Function 為true】,Animal.__proto__ == Function.prototype
4. Animal.prototype是Animal上一個屬性,是一個物件屬性,它【Animal.prototype instanceof Object 為true】,Animal.prototype.__proto__ == Object.prototype

四. 原型物件繼承
當我們宣告一個function關鍵字的方法時,會為這個方法添加一個prototype屬性,指向默認的原型物件,并且此prototype的constructor屬性也指向方法物件
function Person() {
}
var person = new Person();
Person 就是一個建構式,我們使用 new 創建了一個實體物件 person
第一:
每個函式都有一個 prototype 屬性
每一個JavaScript物件(null除外)在創建的時候就會與之關聯另一個物件,這個物件就是我們所說的原型,每一個物件都會從原型"繼承"屬性,

每一個JavaScript物件(除了 null )都具有的一個屬性,叫proto,這個屬性會指向該物件的原型

每個原型都有一個 constructor 屬性指向關聯的建構式 實體原型指向建構式

最終原型鏈

1)什么是原型鏈?
原型鏈的核心就是依賴物件的_proto_的指向,當自身不存在的屬性時,就一層層的扒出創建物件的建構式,直至到Object時,就沒有_proto_指向了,
2)如何分析原型鏈?
因為_proto_實質找的是prototype,所以我們只要找這個鏈條上的建構式的prototype,其中Object.prototype是沒有_proto_屬性的,它==null,
最簡單的原型鏈分析
function Person(name){
this.name = name;
}
var p = new Person();
//p ---> Person.prototype --->Object.prototype---->null
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/111875.html
標籤:JavaScript
