1、無論什么時候,只要創建了一個函數,就會默認給這個函數創建一個PRototype屬性,這個屬性指向這個函數的原型對象。所有原型對象都會自動獲得一個constructor屬性,這個屬性包含一個指向prototype屬性所在的函數的指針。
function Person(){ name: 'Bob', sayName: function(){ console.log(this.name) }}var person1 = new Person()Person.prototype == person1.__proto__;//true2、通過構造函數創建的實例,都會有一個__proto__
屬性,這個屬性是指向該構造函數的prototype屬性所在的原型對象的一個指針。也就是說,實例和構造函數之間其實是沒有什么關聯的
3、當為實例添加一個屬性的時候,該屬性默認會覆蓋原型中的同名屬性,不過可以通過delete操作符刪除實例中的屬性,然后就可以再次訪問到原型中的同名屬性了。
function Person(){ name: 'Bob', sayName: function(){ console.log(this.name) }}var person1 = new Person();person1.name = "Linda";console.log(person1.name);//"Linda"http://使用delete刪除實例中的同名屬性delete person1.name;person1.name;//"Bob"4、幾個常用的操作符和方法 (1) hasOwnProperty() 當要校驗的屬性存在于對象實例中,而不是原型中時,該方法返回true (2)for-in 使用for-in循環,返回的是能夠通過對象訪問的,可枚舉的所有屬性,無論該屬性存在于原型中還是實例中。當重寫了原型中不可枚舉的屬性時,重寫后的屬性,也會出現在for-in循環中。 (3)in 該操作符會在屬性可以通過”對象.屬性”的方式訪問到給定屬性的時候返回true,無論該屬性存在于實例中還是原型中 (4)Object.keys() 該方法返回對象上所有可枚舉的實例屬性組成的字符串數組。 (5)Object.getOwnPropertyNames() 該方法返回所有實例屬性,不管該屬性是否可枚舉。
5、調用構造函數創建實例時,會為實例創建一個指向最初原型的__proto__
指針,但是重寫原型(使用對象字面量的方式),會切斷構造函數與最初原型之間的聯系。而且會導致原型中的constructor屬性不再指向原來的構造函數,而是指向Object。
__proto__
屬性指向的還是最初的原型對象,而不是重寫后的原型對象,所以會報錯。重寫原型,切斷了現有原型與重寫之前創建的所有實例之間的聯系,他們引用的還是最初的原型可以使用下面的方式,將原型中的constructor屬性重新指向Person構造函數,但是這種方式會導致constructor屬性的[[Enumerable]]特性設置為true(默認為false)。
Person.prototype = { constructor: Person, name: "bob", sayName: function(){ console.log(this.name) }}可以使用Object.defineProperty()方法,將constructor屬性的可枚舉屬性,設置為false。
Object.defineProperty(Person.prototype,"constructor",{ enumerable: false, value: Person})新聞熱點
疑難解答