學習筆記之重寫原型

重寫原型相對的比較簡單

function Person(){}
			
Person.prototype = {
		name : "zhangsan",
		age : 22,
		sayHi : function(){
			alert("hi");
		}
}

當重寫原型後,實例的構造器將不在指向原型,而是Object,雖然用instanceof判斷沒有問題,實例依舊是Person,但constructor則等於Object不等於Person了

var person = new Person();
console.log(person instanceof Object); //true
console.log(person instanceof Person); //true
console.log(person.constructor == Object); //true
console.log(person.constructor == Person); //false

ECMAScript 5 後的javaScript可以通過defineProperty來將constructor設置回Person

Object.defineProperty(Person.prototype,"constructor",{
	enumerable : false,
	value : Person
});
在來測試一下

console.log(person instanceof Object);//true
console.log(person instanceof Person);//true
console.log(person.constructor == Object);//false
console.log(person.constructor == Person);//true

原型的動態性

在原型中查找值是一次搜索,因此對原型對象的任何修改都可以立即從實例上反映出,比如:

function Person(){}
var person1 = new Person();
			
Person.prototype.name = "zhangsan";
Person.prototype.age = 22;
Person.prototype.sayHi = function(){
	alert("hi");
}
				
person1.sayHi(); //hi
上面即使實例的聲明在原型之前,依據可以訪問sayHi屬性,實例與原型是鬆耦合的關係,但調用sayHi屬性時,先會在實例中查詢,查詢不到會去原型中查詢名爲sayHi的屬性。但如果重寫了原型,就不行了,重寫了原型,實例必須聲明在重寫之後才能訪問原型屬性,否則將拋出異常。

Person.prototype = {
	name : "zhangsan",
	age : 22,
	sayHi : function(){
		alert("hi");
	}
}

person1.sayHi(); //error
var person2 = new Person();
person2.sayHi(); //hi

上面person1拋出了sayHi is not a function而之後聲明的實例person2調用sayHi則是正常的彈出一個提示框






發佈了28 篇原創文章 · 獲贊 13 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章