一、什么是原型模式
在js中,創建對象的方式有工廠模式和構造函數模式等; 而構造函數模式最大的問題在于:構造函數中的每個方法都需要在實例對象中重新創建一遍,不能復用,所以為了解決這一個問題,就需要使用原型模式來創建對象。
原型模式是把所有實例共享的方法和屬性放在一個叫做prototype(原型)的屬性中 ,在創建一個函數時都會有個prototype屬性, 這個屬性是一個指針,指向一個對象,是通過調用構造函數而創建的那個對象實例的原型對象。
// 構造函數function Person() {};// 原型屬性prototypePerson.prototype.name = '張三';Person.prototype.sayName = function() {console.log(this.name);};let person1 = new Person();person1.sayName(); //張三let person2 = new Person();person2.sayName(); // 張三console.log(person1.sayName == person2.sayName); //true1.理解原型對象
無論什么時候,只要創建了一個新函數,就會根據一組特定的規則為該函數創建一個prototype屬性,這個屬性指向函數的原型對象,在默認的情況下,所有的原型對象都自動獲得一個constructor(構造函數)屬性,這是一個指針,指向prototype屬性所在的函數。創建了自定義的構造函數之后,其原型對象默認只會取得constructor屬性;其他的方法則是從Object繼承來的。
當調用構造函數創建一個新實例對象后,該實例的內部將包含一個指針[[Prototype]],指向構造函數的原型對象。這個連接存在于實例和構造函數的原型對象之間,而不是存在實例和構造函數之間。
每當代碼讀取某個對象的某個屬性時,都會執行一次搜索,目標是具有給定名字的屬性。搜索首先從對象實例本身開始。如果在實例中找到了就返回該屬性的值,沒有找到,則繼續搜索指針指向的原型對象,在原型對象中查找具有給定名字的屬性,如果在原型對象中找到了這個屬性,就返回該屬性的值。
雖然可以通過實例訪問保存在原型中的值,但不能通過實例對象重寫原型中的值,如果在實例中添加一個在原型中的同名屬性,該屬性會自動屏蔽原型中的屬性,但是不會修改原型中的屬性,只會阻止訪問原型中的屬性,通過delete操作符則可以完全刪除實例屬性,使得可以重新訪問原型中的屬性。
2.原型與in操作符
hasOwnProperty()方法可以檢測一個屬性是否存在于實例對象中,
// 構造函數function Person() {this.age = 16;};Person.prototype.name = "張三";let person1 = new Person();console.log(person1.hasOwnProperty('name')); // falseconsole.log(person1.hasOwnProperty('age')); // truein操作符的使用可以分為兩類,單獨使用和在for-in循環使用,在單獨使用時,in操作符會在通過對象能夠訪問給定屬性時返回true,無論該屬性存在于實例中還是原型中。
新聞熱點
疑難解答
圖片精選