动态

详情 返回 返回

JavaScript中原型與原型鏈 - 动态 详情

構造對象

function Person() {}

let person = new Person()

上面程序建立了一個Person類型的實例

原型

function Person() {}

Person.prototype.name = "ztq"
Person.prototype.sayHi = function () {console.log("hello world")}

let person1 = new Person()
let person2 = new Person()

console.log(Person.prototype) // { name: 'ztq', sayHi: [Function (anonymous)] }
console.log(person1.name) // ztq
console.log(person2.name) // ztq

prototype (2).svg
每個構造函數都有一個prototype屬性指向實例原型,那什麼是實例原型?你可以理解為值為與實例對象相關聯的一個原始狀態的對象。實例中無法獲取到的屬性值會去原型中找,這也是後面實現繼承的最重要的特性。

constructor

function Person() {}

Person.prototype.name = "ztq"
Person.prototype.sayHi = function () {console.log("hello world")}

let person1 = new Person()
let person2 = new Person()

console.log(person1.constructor) // [Function: Person]
console.log(person2.constructor) // [Function: Person]
console.log(person1.constructor === person2.constructor) // true

實例原型的constructor指針會指向構造函數
prototype (1).svg

proto

在每個實例對象中都有一個[[prototype]]屬性,這個屬性我們無法通過標準方式直接訪問到,但在chromefirefoxsafria瀏覽器中有__proto__屬性。在現在的標準中,getPrototypesetPrototypeOf可以獲取和設置__proto____proto__屬性實際是指向[[prototype]]的引用。

function Person() {}

Person.prototype.name = "ztq"
Person.prototype.sayHi = function () {console.log("hello world")}

let person1 = new Person()
let person2 = new Person()

console.log(person1.__proto__)  // { name: 'ztq', sayHi: [Function (anonymous)] }
console.log(Object.getPrototypeOf(person1)) // { name: 'ztq', sayHi: [Function (anonymous)] }

prototype.svg

原型鏈

實例對象通過__proto__獲取實例原型,但實例原型也是一個對象,那麼它也有自己的實例原型

function Person() {}

Person.prototype.name = "ztq"
Person.prototype.sayHi = function () {console.log("hello world")}

let person1 = new Person()
let person2 = new Person()

console.log(person1.__proto__)  // { name: 'ztq', sayHi: [Function (anonymous)] }
console.log(person1.__proto__.__proto__) // [Object: null prototype] {}

prototype (3).svg
由原型的原型這麼連接而成的鏈就成了原型鏈,在圖片中由藍色的線構成,實例對象可以獲取原型中的屬性,這就構成了由原型鏈實現繼承的重要特性。

Add a new 评论

Some HTML is okay.